小编dra*_*gen的帖子

在C#中异步和等待:我是否必须将整个调用链更改为Void方法?

我对C#上的整个Async/Await主题完全不熟悉.尽管有无数的问题得到解答,并且教程被无情地链接起来,但我仍然无法理解如何使用async/await.我想要实现的是wpf应用程序返回到UI上的渲染动画,同时它等待一个昂贵的方法调用来完成 - 在我的下面的例子中,那是GetLinesAsync()或者更具体地说,expensive_function()在:

void Button_Click(object sender, RoutedEventArgs e) {
    MessageBox.Show(GetAMessage());
}

string GetAMessage() {
    string ret = "";
    foreach(string s in GetLinesAsync().Result)
        ret += $"{s}\n";
    return ret;
}

async Task<List<string>> GetLinesAsync() {
    List<string> ret = new List<string>();
    string[] ExpensiveResult = null;
    if (await Task.Run(() => expensive_function(ref ExpensiveResult)) == expensive_stat.SUCCESS && ExpensiveResult != null)
    {
        foreach(string s in ExpensiveResult)
            ret.Add(s);
    }
Run Code Online (Sandbox Code Playgroud)

这样写,应用程序完全冻结,即使expensive_function()执行时间不长.除此之外,我不确定为什么会发生这种情况,这是我从await/async上阅读教程和解释时所理解的,特别是那些说你只能等待返回void或Task的方法的部分:

该生产线foreach(string s in GetLinesAsync().Result)实际上应该说foreach(string s in await GetLinesAsync().Result) …

c# multithreading asynchronous async-await

0
推荐指数
1
解决办法
174
查看次数

标签 统计

async-await ×1

asynchronous ×1

c# ×1

multithreading ×1