0

我有一堆需要异步调用的 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”运算符,因为当前此代码将同步运行。await 运算符去哪儿了?

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

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

1 回答 1

6

task.Wait();是多余的,调用task.Result会隐式等待。

这是您重写后使用的方法await

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

return myResult.FullName;

您不需要任何一个,因为on a.Result的类型是。awaitTask<T>T

在异常处理的主题上,您需要在(或在您的原始代码中)做一个try/ 。因为那是异常将被重新抛出的时候。请注意,仅当在 中抛出异常时才如此,理论上函数本身可能会抛出必须在此处捕获的异常。catchawaitResultTaskGet

另请注意,由于您要返回 an 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.
}
于 2015-05-15T23:08:30.037 回答