我怎么知道任务是否完成

Jil*_*ill 0 c# async-await

我有一个网格,当选择一行时,它会加载大量信息-需要再加载7个网格和一个DevExpress报告,这需要很多时间

我将所有方法都放在任务中以加快流程。

但是,如果在上一个完成加载之前选择了另一行,则会导致错误。

我想知道如何检查任务是否完成以及在再次加载新数据之前先等待还是取消任务。(我是异步编程的新手)

这是我的任务的一个示例(其中有8个,每个任务一个接一个):

    private async void LoadSSNs()
    {
        await Task.Run(() => grdSSNs.DataSource = ICTBLL.GetData(ID));
    }
Run Code Online (Sandbox Code Playgroud)

如何将其更改为可以检查是否完成的Task对象?

ror*_*.ap 5

您几乎永远都不应void使用async / await来返回类型(有例外,但从此开始)。您的方法需要返回a,Task因此您需要等待或检查完成状态。

private async Task LoadSSNs()
{
    await Task.Run(() => grdSSNs.DataSource = ICTBLL.GetData(ID));
}
Run Code Online (Sandbox Code Playgroud)

您如何确定任务是否完成取决于您需要执行的操作。如果您需要在任务异步运行时做一些工作,可以这样做:

var t = LoadSSNs();

// do something while task is running.

t.Wait(); // this is one option.
if (t.Status == TaskStatus.Faulted) { } // handle problems from task.
Run Code Online (Sandbox Code Playgroud)

如果任务完成时您还有更多工作要做,则可以执行以下操作:

while(!t.IsCompleted)
{
    // do some other work.
}
Run Code Online (Sandbox Code Playgroud)

同样,该任务由您自己决定;重要的部分是您需要Task从异步方法中返回一个awaitable 。

  • 注意:你不能调用 `t.Wait();` 然后检查 `t.Status == TaskStatus.Faulted` 因为 `t.Wait()` [抛出异常](https://learn.microsoft.com /en-us/dotnet/api/system.threading.tasks.task.wait?view=net-5.0#System_Threading_Tasks_Task_Wait) 如果任务有错误(状态为“TaskStatus.Faulted”)。您需要“try-catch”才能正确执行该检查。 (2认同)