调用非异步方法

时间:2019-11-02 23:07:03

标签: c# async-await

具有一个使用DbContext从sql返回结果的类库。 如果我想建立一个

类库方法可能需要几秒钟的时间。此类会在其Startup中注入到asp.net核心Webapp中

class Util
{

    public string DoStuff(string colorVal) {

        string ourValue = (from a in ctx.BigTable where a.color == colorVal select a.DoneFlag).FirstOrDefault();

        return ourValue;

    }
}

如果我打算从这样的代码中使用它,是否还需要使该方法异步

Web project

        Util o;

        public async Task<IViewComponentResult> InvokeAsync()
        {
            var item = await GetMatchingColorAsync();
            return View(item);
        }

        private Task<string> GetMatchingColorAsync()
        {
            string matchingColor = o.DoStuff("red");            
            return Task.FromResult(matchingColor);
        }

1 个答案:

答案 0 :(得分:1)

理想上是。您甚至可以在使用FirstOrDefaultAsync时使用它(取决于您的基础数据源是什么):

public async Task<string> DoStuff(string colorVal) {

    string ourValue = await (from a in ctx.BigTable where a.color == colorVal select a.DoneFlag).FirstOrDefaultAsync();

    var someColor = await GetMatchingColorAsync();

    return ourValue;

}

Microsoft有一系列有关Asynchronous programming with async and await的文章,写得很好。他们值得一读。

如果您绝对不能更改调用方法,则可以同步等待:

public string DoStuff(string colorVal) {

    string ourValue = (from a in ctx.BigTable where a.color == colorVal select a.DoneFlag).FirstOrDefault();

    var someColor = GetMatchingColorAsync().GetAwaiter().GetResult();

    return ourValue;

}

容易吗?除了会阻塞线程(您将失去异步方法的优势),而且还存在死锁的风险,如本文所述:Don't Block on Async Code

那就不好了