非阻塞任务。在.NET 4.5中等待。

5
Task t = Task.Run(async () => { await someAsyncMethod(); });
t.Wait();

这是否意味着在等待期间,线程会被用于其他事情而不是只是坐在那里等待任务完成?只是因为我使用了{await someAsyncMethod();}>吗?

1
相反:当前线程将在任务完成时阻塞 - dlev
2个回答

7

Wait(等待)会阻塞调用线程。

要进行非阻塞等待,请使用await(等待)

await Task.Run(async () => { await someAsyncMethod(); });

然而,Task.Run 应该通常只用于 CPU-bound 方法,因此你更可能只需这样做:

await someAsyncMethod();

3
我明白了,但如果这段代码运行的方法不是异步的,我就不能使用await。有没有其他办法可以实现同样的效果? - some_guy
2
@some_guy 在你的代码中调用了 await,在任务内部,因此显然它已经是异步的。如果该方法确实是同步的 CPU 绑定方法,那么使用 Task.Run 就是合适的。 - Servy
我的意思是,持有我发布代码的方法不是异步的,但一些异步方法(someAsyncMethod())是异步的。 - some_guy

-2

我曾经遇到过类似的问题,使用了以下代码:

var t = Task.Run(async () => { await someAsyncMethod(); });
t.Result;

这似乎不会阻塞线程。


那么 t.ContinueWith((t) => result = t.Result)); 怎么样? - Adina
那个不能编译。result是什么? - Servy
一个更完整的版本可能是这样的:public SomeType MethodThatIsNotAsync() { SomeType result = default(SomeType); var t = Task.Run<SomeType>(async () => await SomeMethodCall()); t.ContinueWith((t1) => result = t.Result); return result; }public SomeType SomeMethodCall() { // 做一些事情 return default(SomeType); } - Adina
在这种情况下,您每次都返回默认值。您永远不会返回实际结果。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接