没有掌握 C# 中的 TASKs 和 WAIT

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

与 class 定义为:

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" 运算符,因为目前此代码将 运行 同步。 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

关于异常处理的主题,您需要围绕 await(或原始代码中的 Result)执行 try/catch。因为那是异常将被重新抛出的时候。请注意,只有在 Task 中抛出异常时才会出现这种情况,理论上 Get 函数本身可能会抛出必须在那里捕获的异常。

另请注意,由于您要返回 async,因此您可以选择在 await(或 Result)调用的任何位置捕获异常。

最后不要忘记,如果您不这样做 await,您的任务 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.
}