为什么我的方法没有异步运行
本文关键字:异步 运行 我的 方法 为什么 | 更新日期: 2023-09-27 18:35:43
>我正在运行一个测试,该测试应该多次调用一个方法而不等待其结果。 这是我的代码:
private async Task HandleJob(string params) {
// do stuff that takes a minute
Thread.Sleep(10000);
return;
}
[TestMethod]
public async Task StartTest() {
HandleJob("one");
HandleJob("two");
}
当我在HandleJob("two")
设置休息时,只有在one
完成后它才会被击中。 如何使它们异步运行,以便不进行等待?
您根本没有在方法中使用await
。这意味着该方法将同步执行这些行。要实际让回调用方并让剩余的代码异步运行,您需要使用 await
,它将继续该方法作为目标Task
的延续(以及取消任何异常和返回值的框)
Task
有几个辅助方法可以帮助解决这个问题 - 我最喜欢的是 Task.Yield()
,它会立即返回,因此await Task.Yield()
会吐出到一个新线程中并一次全部返回。
[TestMethod]
public async Task StartTest() {
await Task.Yield(); // await yields control, and Yield will ensure the rest of the method starts immediately
HandleJob("one");
HandleJob("two");
}
如果您希望单个子任务一次执行所有任务,请使用Task.WhenAll
和Task.Run
将它们组合在一起
[TestMethod]
public async Task StartTest() {
await Task.WhenAll(
Task.Run(() => HandleJob("one")),
Task.Run(() => HandleJob("two")));
}
您的异步方法HandleJob
并没有真正async
,因为Thread.Sleep
阻塞了当前线程。请尝试改用await Task.Delay
。请注意,params
是一个关键字,原始代码无法编译。我已将其更改为parameters
.
private async Task HandleJob(string parameters) {
// do stuff that takes a minute
await Task.Delay(10000);
return;
}
在 start 方法中,您可以返回一个 Task
,当两个方法都使用完Task.WhenAll
时完成,如其他答案之一中所述。如果您返回结果而不是await
它,则StartTest
的调用方可以确定他是在等待Task
完成,还是忽略它并成为火灾并忘记的情况。因为您没有使用await
StartTest
所以不再需要标记为async
。
[TestMethod]
public Task StartTest() {
return Task.WhenAll(HandleJob("one"), HandleJob("two"));
}
您需要await
这两个任务:
private void HandleJob( params string[] value )
{
return;
}
[TestMethod]
public async Task StartTest()
{
var task1 = Task.Run( () => HandleJob( "one" ) );
var task2 = Task.Run( () => HandleJob( "two" ) );
await Task.WhenAll( task1 , task2 );
}