c# - 如何以及何时从 awaitable(async) 方法获取返回值

标签 c# .net async-await

我很确定,这个问题已经得到解答,而且我阅读了很多相关内容,但不知何故我无法在我的代码中使用它。这是确切的代码库。

我的库中有这个异步方法,它在执行一些数据库条目时返回一个字符串:

public class MyLibrary
{
public async Task<string> DoSomethingAsync()
{
    return await DoAsync();
} 

// some private method, with multiple parameters
private Task<string> DoAsync()
{
    return Task.Run(() => Do());
}
}

现在在 UI 上,下面导致卡住状态或死锁:

var myTask = MyLibraryobject.DoSomethingAsync();
console.Write(myTask.Result); 

因为我的调用是可等待的,所以我想,UI 线程会等待我的调用来完成它的业务并填充结果,不是吗?或者因为调用在另一个线程上运行,所以当我的光标到达第 2 行时任务可能尚未完成。那现在怎么办?光标会等到任务完成,或者只要任务完成就执行第 2 行?对我来说听起来是同步的..

此外,如果有的话,我想“明确地”等到任务完成,我该如何执行?一些帖子,建议像下面那样做,这给了我结果,但造成了更多的困惑:

var myTask = Task.Run(async () => await MyLibraryobject.DoSomethingAsync());
myTask.Wait();
console.Write(myTask.Result);

上面发生了什么?为什么我应该创建另一个任务并将其设置为等待?我不能等待异步方法使用的线程吗?同样,我显然在这里遗漏了一些基本的东西。

最后,这是一个异步调用,但 UI 线程正在等待它完成,因此给我的印象是它是同步的。我认为对吗?那么异步方法的主要目的是什么,它返回一些东西,UI 等待它完成?

此外,非异步和异步的即发即弃调用之间有什么区别?对于此类调用,返回 Task 而不是 void 有什么好处吗?

我很确定,在我的大脑中,一些断开的链接将所有这些部分连接在一起。有人可以给我解释一下吗??

最佳答案

你可能应该从我的 async intro 开始并跟进我关于 async best practices 的文章.他们几乎可以回答您的所有问题。

详情...

how and when to fetch return from awaitable(async) method

您应该使用 await 从异步任务中获取结果。

I have this async method in my library, that returns a string upon doing some DB entries

那么它不应该使用 Task.Run。它应该使用自然异步 API,例如 Entity Framework 的 FirstAsync

Since my call is awaitable, I think, UI thread waits for my call to finish its business and populate the result, doesn't it?

没有。 UI 正在阻塞,因为您的代码正在调用 ResultResult 是一个阻塞调用。

sounds synchronous to me..

那是因为您使用 Result 使其同步。如果您使用 await,代码将执行串行,但异步

Also if at all, I want to 'exlicitly' wait till the task gets finished, how do i enforce that?

您的代码已经这样做了。在任务完成之前,它会显式阻塞。如果您将其更改为正确使用 await,它将显式等待(但不阻塞)直到任务完成。

some posts, suggested in doing like below

没有。不要在不必要的情况下使用 Task.Run

can't I wait for the thread, used by the async method?

纯异步方法不使用线程。

Then what is the main purpose of async methods, which return something, and UI waits for it to complete?

异步在与 await 一起使用时才有意义。

关于c# - 如何以及何时从 awaitable(async) 方法获取返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42055225/

相关文章:

c# - 是否可以在 C# 中观察 Rss 提要的变化?

c# - 如何避免鼠标在 Touch 上移动

c# - 重新排序和拖动装饰器在 Flyout 中不可见

c# - WPF 将命令绑定(bind)到 Datagrid 内的 Datacontext

.net - JSON.NET:如何将现有的 JSON 插入到另一个中间?

.net - Entity Framework 4.0 不适用于计算属性

javascript - Node.js 中的 "done"回调函数是什么?

C#:如何使用类型执行 'as' 操作

c# - C# 中循环异步任务列表

javascript - 为什么 async/await 函数运行两次?