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)