编写一个等待bool的异步方法

Vac*_*ano 15 .net c# asynchronous async-await

我想写一个方法,将await变量设置为true.

这是psudo代码.

bool IsSomethingLoading = false
SomeData TheData;

public async Task<SomeData> GetTheData()
{
   await IsSomethingLoading == true;
   return TheData;
}
Run Code Online (Sandbox Code Playgroud)

TheData将由Prism事件和IsSomethingLoading变量设置.

我调用了该GetTheData方法,但我希望它能运行异步(现在它只是在数据没有准备好的情况下返回null.(这会导致其他问题.)

有没有办法做到这一点?

Ser*_*rvy 18

在这种情况下,你需要的是一个TaskCompletionSource.

您可能有一种方法能够在某个时间点生成数据,但它不会使用任务来执行此操作.也许有一种方法需要一个提供结果的回调,或一个被触发的事件来指示结果,或者只是使用一个Thread或者ThreadPool你不想重新使用的代码Task.Run.

public Task<SomeData> GetTheData()
{
    TaskCompletionSource<SomeData> tcs = new TaskCompletionSource<SomeData>();
    SomeObject worker = new SomeObject();
    worker.WorkCompleted += result => tcs.SetResult(result);
    worker.DoWork();
    return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)

虽然您可能需要/想要向TaskCompletionSource工作者或其他类提供,或以其他方式将其暴露给更广泛的范围,但我发现它通常不需要,即使它在适当的时候是一个非常强大的选项.

您也可以使用Task.FromAsync基于异步操作创建任务,然后直接返回该任务,或者await在代码中返回该任务.


Bor*_*ort 11

您可以使用TaskCompletionSource作为您的信号,并且await:

TaskCompletionSource<bool> IsSomethingLoading = new TaskCompletionSource<bool>();
SomeData TheData;

public async Task<SomeData> GetTheData()
{
   await IsSomethingLoading.Task;
   return TheData;
}
Run Code Online (Sandbox Code Playgroud)

在你的Prism事件中:

IsSomethingLoading.SetResult(true);
Run Code Online (Sandbox Code Playgroud)

  • 为什么直接有一个“ TCS &lt;bool&gt;”而不是一个“ TCS &lt;SomeData&gt;”? (2认同)

小智 6

这对我来说工作:

while (IsLoading) await Task.Delay(100);
Run Code Online (Sandbox Code Playgroud)