为什么我的方法没有异步运行

本文关键字:异步 运行 我的 方法 为什么 | 更新日期: 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.WhenAllTask.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 );
    }