Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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# 如何正确编写自定义任务返回方法_C#_Task Parallel Library_Async Await - Fatal编程技术网

C# 如何正确编写自定义任务返回方法

C# 如何正确编写自定义任务返回方法,c#,task-parallel-library,async-await,C#,Task Parallel Library,Async Await,对于异步运行代码(例如使用async/await),我需要一个适当的任务。当然,框架中有几个预定义的方法涵盖了最频繁的操作,但有时我想编写自己的方法。我是新来C#的,所以很可能我做错了,但至少我对目前的做法不太满意。 请参见以下示例了解我所做的操作: public async Task<bool> doHeavyWork() { var b1 = await this.Foo(); //var b2 = await Task<bool&g

对于异步运行代码(例如使用async/await),我需要一个适当的任务。当然,框架中有几个预定义的方法涵盖了最频繁的操作,但有时我想编写自己的方法。我是新来C#的,所以很可能我做错了,但至少我对目前的做法不太满意。 请参见以下示例了解我所做的操作:

public async Task<bool> doHeavyWork()
    {
        var b1 = await this.Foo();
        //var b2 = await Task<bool>.Factory.StartNew(Bar); //using Task.Run
        var b2 =  await Task.Run(()=>Bar());
        return b1 & b2;
    }

public Task<bool> Foo()
    {
        return Task.Factory.StartNew(() =>
                                  {
                                      //do a lot of work without awaiting
                                      //any other Task
                                      return false;
                                  });
    }

public bool Bar()
    {
        //do a lot of work without awaiting any other task
        return false;
    }
公共异步任务doHeavyWork()
{
var b1=wait this.Foo();
//var b2=wait Task.Factory.StartNew(Bar);//使用Task.Run
var b2=等待任务。运行(()=>Bar());
返回b1和b2;
}
公共任务Foo()
{
返回Task.Factory.StartNew(()=>
{
//不用等待就做很多工作
//还有其他任务吗
返回false;
});
}
公共酒吧
{
//在不等待任何其他任务的情况下做大量工作
返回false;
}
一般来说,我创建并使用类似于Foo示例的方法,但是有一个“额外”lambda包含整个方法逻辑,它看起来不太漂亮。另一种选择是使用任何方法,如Bar示例,但我认为这更糟糕,因为不清楚此方法是否应异步运行(除了正确的方法名称,如BarAsync),并且Task.Factory.StartNew可能必须在程序中重复多次。我不知道如何告诉编译器“这个方法返回一个任务,请在调用时将它作为一个整体包装成一个任务”,这就是我想要做的

最后,我的问题是:编写这种方法的最佳方式是什么?我可以去掉“额外”lambda吗(当然不需要添加额外的命名方法)

编辑
正如Servy所说的,总是有很好的理由使用该方法的同步版本。只有绝对必要时才应提供异步版本(Stephen Cleary的链接)。

如果有人想调用
Bar而不在新线程/任务中启动它,世界会结束吗?如果有另一个方法已经在后台线程中,因此它不需要启动新任务来运行长时间运行的代码,该怎么办?如果该方法最终被重构为一个类库,该类库既从桌面应用程序上下文调用,也从ASP或控制台上下文调用,该怎么办?在那些其他上下文中,该方法可能只需要直接运行,而不是作为
任务运行

我想说,你的代码应该看起来像那里的
Bar
那样,除非绝对有必要,在任何情况下,在不启动新的
任务的情况下运行该代码


还请注意,对于较新版本的.NET,您应该从
Task.Factory.StartNew
切换到
Task.Run
,因此代码量应该减少(稍微减少)。

“当然没有添加其他命名方法”
为什么要将其作为一个选项拒绝?创建
public bool Bar
public Task BarAsync
。我想避免开销。如果使用同步或异步方法是有意义的,那就好了。如果没有的话,将会有一个公共的BarAsync和一个私人酒吧(隐藏它),在这种情况下,我看不出有什么理由这么做。好吧,明白你的意思了。因此,没有“将此方法强制到任务中”功能,因为这通常是一个坏主意:)感谢您的任务。运行提示,我不知怎么错过了它…另请参见: