首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不掌握任务的诀窍,在C#中等待

不掌握任务的诀窍,在C#中等待
EN

Stack Overflow用户
提问于 2015-05-15 23:02:13
回答 1查看 126关注 0票数 0

我有一个对web的调用堆栈,需要异步调用。我从来没有用过它。

我创建了一个简单的测试控制台程序,大致如下:

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        ClassOne xx = new ClassOne();
        var v1 = xx.DummyTask();
    }
}

类定义为:

代码语言:javascript
复制
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声明我应该使用“等待”操作符,因为目前这段代码将同步运行。接线员去哪儿了?

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

代码语言:javascript
复制
client.Repository.Get("openEHR", "CKM-mirror");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-15 23:08:30

task.Wait();是红的,对task.Result的调用将隐式地等待。

下面是使用await重写的方法。

代码语言:javascript
复制
Task<Repository> task = client.Repository.Get("openEHR", "CKM-mirror");
var myResult = await task;

return myResult.FullName;

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

关于异常处理问题,您需要围绕try/catch (或原始代码中的Result )进行操作。因为此时异常将被重新抛出。请注意,只有当异常在Task中抛出时,这才是正确的,理论上,Get函数本身可以抛出必须在那里捕获的抛出。

还请注意,由于要返回一个async,所以可以选择在调用的任何地方捕获异常。

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

代码语言:javascript
复制
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.
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30269991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档