繁体   English   中英

没有掌握C#的任务和等待

[英]Not getting the hang of TASKs and WAIT in C#

我有一堆对Web api的调用,这些调用需要异步调用。 我从未使用过aysnc。

我已经按照以下方式创建了一个简单的测试控制台程序:

class Program
{
    static void Main(string[] args)
    {
        ClassOne xx = new ClassOne();
        var v1 = xx.DummyTask();
    }
}

该类定义为:

namespace GHTest.classes
{
    public class ClassOne
    {
        GitHubClient client;

        public ClassOne()
        {
           client = new GitHubClient(new ProductHeaderValue("OMHSite"));
        }

        public async Task<string> DummyTask()
        {
            Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
            task.Wait();

            var myResult = task.Result;
            return myResult.FullName;
        }
    }
}

Visual Studio指出我应该使用“ await”运算符,因为当前此代码将同步运行。 等待操作员去哪里?

此外,如果以下语句引发异常,我该如何在任务中捕获该异常

client.Repository.Get("openEHR", "CKM-mirror");

task.Wait(); 如果是多余的,则对task.Result的调用将隐式等待。

这是您改写为使用await方法。

Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
var myResult = await task;

return myResult.FullName;

您不需要.Result ,因为Task<T>上的await类型为T

关于异常处理,您将需要try / catch await (或原始代码中的Result )。 这样一来,异常将被重新抛出。 请注意,只有在Task抛出异常时,这才是正确的,从理论上讲, Get函数本身可能会抛出该异常,而该异常必须在此处捕获。

还要注意,由于您要返回async您可以选择在await调用(或Result )的任何地方捕获异常。

最后,不要忘记,如果您不await DummyTask的结果, DummyTask您的任务可能不会完成(或Result )。

static void Main(string[] args)
{
    ClassOne xx = new ClassOne();
    var v1 = xx.DummyTask();
    var resultV1 = v1.Result; //Forces the execution of v1 by requesting its result.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM