没有在C#中获得TASK和WAIT

BEN*_*der 0 c# asynchronous task async-await openehr

我有一堆需要异步调用的web api调用.我从未使用过aysnc.

我创建了一个简单的测试控制台程序,类似于:

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

将类定义为:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Visual Studio声明我应该使用"await"运算符,因为此代码将同步运行.等待运营商在哪里?

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

client.Repository.Get("openEHR", "CKM-mirror");
Run Code Online (Sandbox Code Playgroud)

Guv*_*nte 6

task.Wait();是还原剂,调用task.Result会隐含地等待.

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

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

return myResult.FullName;
Run Code Online (Sandbox Code Playgroud)

你不需要.Result任何的类型awaitTask<T>T.

在异常处理的主题,你需要做一个try/ catch周围的await(或Result在原始代码).因为那时异常将被重新抛出.请注意,只有在抛出异常时才会出现这种情况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.
}
Run Code Online (Sandbox Code Playgroud)

  • @BENBUNCoder你还需要`await`或`Wait()``DummyTask()`的结果; 也就是说,在你的`static void Main(string [] args)`中你需要做:`ClassOne xx = new ClassOne(); Task <string> task = xx.DummyTask(); task.Wait(); var v1 = task.Result; Console.WriteLine(V1);`. (2认同)