我有一些执行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,请求信息等,如果从不同的线程继续执行异步方法,它可能无法访问.
当我测试我的方法它似乎工作正常,但这并不能证明任何必要.
我正在尝试编写一个泛型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#的新手,并不太熟悉整个模式匹配的想法.我试图找到一个更好的解决方案,但我担心我甚至无法正确表达问题 - 我希望问题标题至少有些准确.
我想要做的是从中提取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) 我有很多请求需要处理,其中一些可能会同步完成。我想收集所有立即可用的结果并尽早返回,同时等待其余的结果。
大致是这样的:
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?
我正在寻找一个符合以下标准的良好DSL工具/框架:
我希望用户能够指定随后由程序解释的规则.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的工具,您建议我应该使用哪些工具?
你有什么经验,你有什么经验?某项技术是否繁琐,缓慢,过时,即将更换/取消?请告诉我.