Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是与Func同步的void方法<;任务>;或Func<;任务<;T>&燃气轮机;论据实际有用吗?_C# - Fatal编程技术网

C# 是与Func同步的void方法<;任务>;或Func<;任务<;T>&燃气轮机;论据实际有用吗?

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方法是

我正在教我的朋友们AsyncWait关键字,到目前为止,我给了他们一些例子,如下所示

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()));
}