首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用async和await创建您自己的异步方法

如何使用async和await创建您自己的异步方法
EN

Stack Overflow用户
提问于 2014-02-22 21:12:15
回答 2查看 4.2K关注 0票数 2

很长一段时间以来,我一直在努力寻找一种解决方案,它将向我展示如何创建不使用现有异步代码的异步方法。IE someClass.ActionAsync()我基本上一直想做一些事情,比如

代码语言:javascript
复制
public string GetParsedData(string code){
    Console.WriteLine("Starting parser");
    var result = "";
    foreach(var x in code.Split('\n')){
          result += Encode(x);
    }

    return result;

}

所以我知道我必须返回一个Task,但是我还没有找到关于如何等待lambda表达式的信息,也没有找到任何其他关于如何分解它的建议。奇怪的是,我想我从re-sharper给了我过时的建议中找到了答案,我将在下面发布。

EN

回答 2

Stack Overflow用户

发布于 2018-06-01 02:03:31

为了更好地解释所有这些讨论的根源,一本必读的书是微软的"Task-based Asynchronous Pattern",包括帮助学习它的“好方法”的例子。下面的摘要就是从那里抓取的:

我对此也是个新手,但总的来说,我学到的是,你需要区分IO-work和-work。我从上面的@Stephen Cleary评论中得到了很大的启发。

  • IO-bound密集型工作您已经在.NET中有可用的外部xxxxAsync()函数,这是微软首选的机制。如果你的代码包含了对外部async,的调用,那么你的函数也可以被看作是。这样,当CPU空闲等待IO时,调用线程不会被阻塞。
    • for CPU-bound密集型工作,在没有任何外部可用的xxxxAsync()函数可供调用的情况下,在.NET中有一个现有的包装器可用来调用您的代码:Task.Factory.StartNew(NET-4.0)或甚至更简单、更好的Task.Run(NET-4.5),后者在这种情况下是微软首选的(*)。如果您的代码包含对await Task的调用或返回一个Task,,那么您的函数也可以被视为。这样,当密集任务在ThreadPool中运行时,调用线程不会被阻塞。

(*)这种机制不会为CPU密集型函数创建异步包装器。如果您正在创建库,请特别注意不要这样做。相反,情况正好相反:您应该使用Task.Run从代码中调用现有的sync CPU密集型函数。

现在,我为被CPU密集型操作阻塞的WEB-UI线程找到的最佳示例是here。你可以直接去那里,跳过理论部分。

票数 4
EN

Stack Overflow用户

发布于 2014-02-22 21:12:15

所以Resharper建议我使用TaskEx.Run (已被弃用),正确的答案似乎是Task.Run。我发现成功地重写了这个方法,

代码语言:javascript
复制
public async Task<string> GetParsedData(string code){
    Console.WriteLine("Starting parser");
    var taskResult = await Task.Run(() =>
    {
        var result = "";
        foreach(var x in code.Split('\n'))
        {
            result += Encode(x);
        }

        return result;
    });
    return taskResult;
}

现在,我可以根据需要在其他异步方法中对此方法使用await关键字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21954799

复制
相关文章

相似问题

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