使用async/await+TaskCompletionSource:如果你正在使用异步编程模型,可以利用TaskCompletionSource来通知主线程任务已完成并更新变量:
时间: 2024-11-08 16:21:55 浏览: 14
在 C# 的异步编程中,`TaskCompletionSource` (TCS) 是一个重要的工具,特别当你需要创建、取消或完成一个异步操作,而这个操作本身可能来自于非异步的源(如数据库查询、网络请求等)。`TaskCompletionSource` 提供了一个中心化的结构来管理异步操作的状态变化。
当你使用 `async` 和 `await` 关键字,通常是在编写 `async` 方法时。在这种情况下,你可以通过创建一个 `TaskCompletionSource<T>` 对象来手动触发异步操作的结果。例如:
```csharp
private async Task MyAsyncMethod()
{
var tcs = new TaskCompletionSource<int>();
// 启动一个耗时的任务,这里假设是从数据库获取数据
RetrieveDataFromDatabase().ContinueWith(result =>
{
if (result.IsSuccess)
{
tcs.SetResult(result.Value); // 数据获取成功,设置结果
}
else
{
tcs.SetException(new Exception("Error retrieving data")); // 出错,设置异常
}
});
try
{
await tcs.Task; // 主线程等待任务完成,结果会被自动捕获
}
catch (AggregateException e)
{
foreach (var ex in e.Flatten().InnerExceptions)
{
Console.WriteLine(ex.Message);
}
}
}
```
在这个例子中,`tcs.Task` 是异步操作的结果,我们可以通过 `SetResult` 或 `SetException` 来通知主线程任务已经完成或失败。`await` 会让当前的异步方法暂停执行直到 `Task` 完成。
阅读全文