C# 是与Func同步的void方法<;任务>;或Func<;任务<;T>&燃气轮机;论据实际有用吗?
我正在教我的朋友们AsyncWait关键字,到目前为止,我给了他们一些例子,如下所示C# 是与Func同步的void方法<;任务>;或Func<;任务<;T>&燃气轮机;论据实际有用吗?,c#,C#,我正在教我的朋友们AsyncWait关键字,到目前为止,我给了他们一些例子,如下所示 static async Task Do(Func<Task> job) { // some algorithm depends on job parameter. await job(); } 静态异步任务Do(Func作业) { //有些算法依赖于作业参数。 等待工作(); } 我认为这个例子在很多情况下都非常有用 问题 使用带有Func或Func类型参数的void方法是
static async Task Do(Func<Task> job)
{
// some algorithm depends on job parameter.
await job();
}
静态异步任务Do(Func作业)
{
//有些算法依赖于作业参数。
等待工作();
}
我认为这个例子在很多情况下都非常有用
问题
使用带有
Func
或Func
类型参数的void方法是否有用?在我看来,这种方法的存在是有意义的,因为不推荐使用阻塞异步方法。欢迎任何意见 是的,让非异步方法执行委托可能很有用,例如.Net提供的查询
有时,您希望应用程序阻塞,直到被调用方返回特定结果
让我们以这个方法为例
(注意:这是而不是实际实现是在.Net中!)
public void ForEach(操作){
如果(操作是默认的(操作))
抛出新ArgumentNullException(nameof(action),“action不能为null!”);
foreach(本文件中的var元素){
//执行提供的操作(委托)
行动(T);
}
}
在这种情况下,您希望循环同步运行,例如,因为线程安全
另一个例子是
公共静态System.Collections.Generic.IEnumerable,其中(this System.Collections.Generic.IEnumerable source,Func谓词)代码>方法,出于线程安全原因,该方法也将同步运行,因此您的结果将按预期返回
如果需要,也可以始终从单独的线程(或异步方法)调用这些方法。大多数控制台应用程序都是同步运行的,因为没有需要响应的GUI
编辑
另一个以Func为参数的同步方法示例是控制台应用程序。假设您正在实现一个具有库依赖项(您无法控制)的控制台应用程序。此库仅公开任务。
在控制台应用程序中,您通常不使用/不需要异步应用程序,因为没有GUI可以阻止和/或您的应用程序只应在用户提供输入后继续
// External method returning a Task
public Task<int> DoFooAsync(object myParam);
public bool ParseMyFoo(Func<Task<int>> myTask) {
var result = myTask().Result;
if (result == 0xbadbeef || result == 0xf00dbabe) {
Console.WriteLine("Schrödingers takeaway");
}
}
public static void Main(string[] args) {
Console.WriteLine("Assesment: {0}", ParseMyFoo(DooFooAsync(Console.ReadLine()));
}
//返回任务的外部方法
公共任务dofoosync(对象myParam);
公共bool ParseMyFoo(Func myTask){
var result=myTask().result;
如果(结果==0xBADBEF | |结果==0xf00dbabe){
Console.WriteLine(“薛定谔外卖”);
}
}
公共静态void Main(字符串[]args){
WriteLine(“assessment:{0}”,ParseMyFoo(DooFooAsync(Console.ReadLine());
}
使用带有Func
或Func
类型参数的void方法是否有用
是的。它将是一个与该委托同步执行某些操作的方法。它不会直接执行该委托
我想到的一个例子是一种用于异步工作队列的Add
方法。委托将在“队列运行器”代码中的其他位置执行。向队列添加委托将是一种同步操作,即使委托本身是异步的。静态任务do(Func作业){return job();}
?返回DoSomethingElse(job)
?“以下内容对我来说似乎没有什么用处。”--它与等待job()
一样有用。假设在调用job()
之前/之后完成了其他工作,而不管job()返回的任务是否
是否等待。第二个执行作业
函数并返回结果。我已经编写了一些方法,这些方法接受作业
并在另一个线程上运行该作业。该方法可能返回自己的任务
,也可能不返回,但它不会是异步的
。您的返回方法可能不是同步无效的不知道。它可能会做一些类似于将作业
发送到另一个线程的事情。为什么你要用操作
而不是Func
或Func
?它们本质上是一样的,这只是一个实现示例。我在底部添加了第二个使用Func的示例。我将添加更多的代码。@canton7抱歉,你说得对。忘记了Result属性。Main
将无法捕获在ParseMyFoo
中抛出的任何可能的异常,因此这个示例对于教学来说太糟糕了。
// External method returning a Task
public Task<int> DoFooAsync(object myParam);
public bool ParseMyFoo(Func<Task<int>> myTask) {
var result = myTask().Result;
if (result == 0xbadbeef || result == 0xf00dbabe) {
Console.WriteLine("Schrödingers takeaway");
}
}
public static void Main(string[] args) {
Console.WriteLine("Assesment: {0}", ParseMyFoo(DooFooAsync(Console.ReadLine()));
}