- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我很确定,这个问题已经得到解答,而且我阅读了很多相关内容,但不知何故我无法在我的代码中使用它。这是确切的代码库。
我的库中有这个异步方法,它在执行一些数据库条目时返回一个字符串:
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 正在阻塞,因为您的代码正在调用 Result
。 Result
是一个阻塞调用。
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/
我有一个 forEach循环处理数组中的数据。在该循环中间的某个地方,我必须等待 DOM 元素的更改,获取该更改,处理它,然后才能继续处理数组。 我希望在控制台中看到这个: Preparing "aa
给定以下方法: public async Task DoSomethingAsync() { // do some work await OpenSomeFileAsync();
尝试在 .exports 中运行一个异步函数,获取 Promise,然后在下一个异步函数中使用结果,但由于某种原因,无论等待如何,第二个函数都会在第一个函数之前执行。 销售.js = const sq
谁能解释为什么 c# 5 中的异步函数需要至少有 1 个等待?我找不到明确的理由/解释。 所谓必需,是指当异步函数内部没有任何 await 调用时编译器会发出警告,但不会抛出编译错误。 来自 this
我想用 Mocha 测试异步代码. 我跟着这个教程testing-promises-with-mocha .最后,它说最好的方法是 async/await。 以下是我的代码,我打算将 setTimeo
这个问题在这里已经有了答案: How do yield and await implement flow of control in .NET? (5 个答案) How is resumption
我想在 trait 中编写异步函数,但是因为 async fn in traits 还不被支持,我试图找到等效的方法接口(interface)。这是我在 Rust nightly (2019-01-0
在 node.js 中,我有一个数据库事务,我想在 then 回调中调用一个 async 方法,但我收到错误消息 关键字“等待”已保留。 这是异步 saveImage 函数: const saveIm
我正在包装 AspNet.Identity。但有些事情让我对 TPL 感到困惑。 第一个例子: public virtual async Task RemovePasswordAsync(st
我有三个 showDialog 示例。我认为 _showAlert1 是正确的,但它使用 2 个函数来实现它。 _showAlert2 也有效,但我认为它不正确,因为我认为 showDialog 是异
我正在编写一个应该尽可能快地执行所有异步函数的函数,但是,它们中只有 5 个可以同时运行。 我想使用 Promise.race 来实现,所以实现不是最好的。问题是代码执行不会在 await 处停止。我
在 Scala 和其他编程语言中,可以使用 Futures 和 Await。 (在实际代码中,会使用例如 zip+map 而不是 Await) def b1() = Future { 1 } def
这个问题在这里已经有了答案: At the end of an async method, should I return or await? (2 个回答) 8年前关闭。 我做了一些阅读,并认为我已
我知道这是一个非常开放的问题,我深表歉意。 我可以看到 Await.ready返回 Awaitable.type而 Await.result返回 T但我仍然混淆他们。 两者有什么区别? 一个是阻塞的,
为什么等待者(GetAwaiter - 使类可等待)是结构而不是类。使用类有什么坏处吗? public struct ConfiguredTaskAwaiter : ICriticalNotifyCo
这个问题在这里已经有了答案: Why doesn't Scala's Future have a .get / get(maxDuration) method, forcing us to resor
async/await 链中的所有函数都必须使用 async/await 关键字吗? async function one() { return await fetch(.....); } asy
点击组件的按钮时将执行以下方法。 async onClickButton() { await this.shoppingCartService.add(this.selectedOffer);
它似乎被记录在案的唯一地方是 this issue thread和 the actual specification .但是,删除的原因并没有在我能找到的任何地方发布。 新的推荐方式似乎是await
为什么使用 await 需要将其外部函数声明为 async? 例如,为什么这个 mongoose 语句需要它所在的函数来返回一个 promise? async function middleware(
我是一名优秀的程序员,十分优秀!