小编enz*_*nzi的帖子

我可以在SignalR集线器中使用`ConfigureAwait(false)`,还是SignalR基础设施依赖于SynchronizationContext?

我有一些执行I/O操作的集线器方法,我想异步调用它.

ConfigureAwait(false)在我的集线器方法中使用是否安全,或者SignalR是否需要捕获的SynchronizationContext用于请求信息或类似的东西?

    public async Task<Response> Save() {
        // do some prep work
        var response = await SaveThingsAsync().ConfigureAwait(false);
        // do something with response
        return response;
    }
Run Code Online (Sandbox Code Playgroud)

为了澄清:我的代码不需要线程文化或SynchronizationContext中存储的任何其他内容.
我担心的是SignalR服务器代码可能在那里存储信息,例如客户端ID,请求信息等,如果从不同的线程继续执行异步方法,它可能无法访问.

当我测试我的方法它似乎工作正常,但这并不能证明任何必要.

c# signalr signalr-hub

4
推荐指数
1
解决办法
329
查看次数

如何在F#中编写高效的list/seq函数?(mapFoldWhile)

我正在尝试编写一个泛型mapFoldWhile函数,它只是mapFold需要state成为一个option并在遇到None状态时立即停止.

我不想使用,mapFold因为它将转换整个列表,但我希望它一旦None找到无效状态(即)就停止.

这是我的第一次尝试:

let mapFoldWhile (f : 'State option -> 'T -> 'Result * 'State option) (state : 'State option) (list : 'T list) =
  let rec mapRec f state list results =
    match list with 
    | [] -> (List.rev results, state)
    | item :: tail -> 
      let (result, newState) = f state item
      match newState with 
      | Some x -> mapRec f newState tail (result …
Run Code Online (Sandbox Code Playgroud)

f#

4
推荐指数
1
解决办法
312
查看次数

F#模式匹配:如何匹配共享相同参数的一组可能类型?

我是F#的新手,并不太熟悉整个模式匹配的想法.我试图找到一个更好的解决方案,但我担心我甚至无法正确表达问题 - 我希望问题标题至少有些准确.

我想要做的是从中提取2个"参数" listMethod. listMethod是具有字符串和Expression"参数" 的几种类型之一(我怀疑参数是错误的术语):

    let (varDecl, listExpr) =
        match listMethod with 
        | Select (var, expr)  -> (var, expr)
        | Where (var, expr)   -> (var, expr)
        | Sum (var, expr)     -> (var, expr)
        | Concat (var, expr)  -> (var, expr)
Run Code Online (Sandbox Code Playgroud)

然后我继续使用varDecl,最后有一个类似的匹配表达式与实际的listMethod代码,它使用我创建的几个临时变量varDecl.

我现在的问题是:如何使上述代码更紧凑?

我希望匹配所有具有2个参数(类型string和类型Expression)的类型,而不是自己列出它们,这有点丑陋且难以维护.

ListMethod类型声明如下(整个事情是一个FsLex/FsYacc项目):

type ListMethod =
    | Select of string * Expr
    | Where of string * Expr
    | Sum of string * …
Run Code Online (Sandbox Code Playgroud)

f# pattern-matching fsyacc

3
推荐指数
2
解决办法
1026
查看次数

在等待异步任务之前检查异步任务是否同步完成的正确模式

我有很多请求需要处理,其中一些可能会同步完成。我想收集所有立即可用的结果并尽早返回,同时等待其余的结果。

大致是这样的:

List<Task<Result>> tasks = new ();
List<Result> results = new ();

foreach (var request in myRequests) {
  var task = request.ProcessAsync();
  if (task.IsCompleted)
    results.Add(task.Result);  // or  Add(await task)  ?
  else 
    tasks.Add(task);
}

// send results that are available "immediately" while waiting for the rest
if (results.Count > 0)  SendResults(results);

results = await Task.WhenAll(tasks);
SendResults(results);
Run Code Online (Sandbox Code Playgroud)

我不确定依赖是否IsCompleted是一个坏主意;是否存在其结果不可信或可能再次变回false等情况?

task.Result同样,即使在检查之后使用是否会存在危险IsCompleted,是否应该始终选择await task?如果使用ValueTask代替呢Task

c# async-await

1
推荐指数
1
解决办法
922
查看次数

在.NET中使用DSL(工具)的经验

我正在寻找一个符合以下标准的良好DSL工具/框架:

  • 可与C#一起使用
  • 在Windows Azure上运行 - 编译器可以在任何地方生成,但实际的解析在云中进行
  • 尽可能快速且资源效率高

我希望用户能够指定随后由程序解释的规则.DSL基本上是任何脚本语言的子集 - 数学运算,if语句,字符串操作等 - 适用于域对象(例如if (SomeComponent.Child3.SomeProperty > 3) SomethingElse.Color = Color(50,0,0)).
由于它是创建规则的用户,我认为使用像IronPhyton这样的真实脚本语言(闻起来像SqlInjection,但更糟)是个坏主意 - 而且,我不希望用户实际编程,所以语法应该是尽可能简单易懂,因此是DSL.

我到目前为止所使用的工具是:

......还有更多我在这里读过的关于SO的内容但是还没详细看过(比如Oslo/MGrammar,Boo,Antlr ......)

我究竟在问什么?
1.我应该详细查看哪些用于在C#(或.NET)中创建DSL的工具,您建议我应该使用哪些工具?
你有什么经验,你有什么经验?某项技术是否繁琐,缓慢,过时,即将更换/取消?请告诉我.

.net dsl azure

0
推荐指数
1
解决办法
616
查看次数

标签 统计

c# ×2

f# ×2

.net ×1

async-await ×1

azure ×1

dsl ×1

fsyacc ×1

pattern-matching ×1

signalr ×1

signalr-hub ×1