c#中async Task 怎么调用等待结果
时间: 2024-10-25 08:08:49 浏览: 39
在C#中,`async`和`Task`通常用于编写异步代码,这样可以在执行任务的同时继续处理其他事情,而不会阻塞线程。当你想要等待`Task`的结果时,你可以使用以下几个关键字:
1. **await 关键字**:这是异步编程的核心,当你在一个`async`方法内部遇到`await Task`语句时,当前的异步操作会被挂起,控制权会返回到调用者那里。一旦`Task`完成(无论成功还是失败),`await`表达式后面的代码将被执行。
```csharp
async Task MyAsyncMethod()
{
var result = await SomeLongRunningTask(); // 这里是异步任务
// 在这里,SomeLongRunningTask()的执行被挂起,直到其完成
}
```
2. **`Task.Wait()`或`Task.Result`**:如果你不希望使用`await`,可以直接调用这些方法来等待任务完成。但这种方式可能会导致阻塞UI线程,所以不推荐在主线程上直接使用。
```csharp
Task task = SomeLongRunningTask();
task.Wait(); // 不推荐使用,因为它会阻塞当前线程
// 或者
var result = task.Result; // 使用Result会导致同步阻塞,如果出错也不会抛异常
```
3. **`await TaskCompletionSource`**: 如果你需要在没有原始任务的情况下等待某个异步操作的结果,可以使用`TaskCompletionSource`。例如,你可能从回调或外部API获取一个`Task`,然后包装成一个新的`Task`等待结果。
```csharp
TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();
tcs.Task.ContinueWith((_, state) => { /* 处理结果 */ });
// ... 后续代码触发tcs.SetResult() 或 SetException()
// 等待任务完成并获取结果
int result = await tcs.Task;
```
记住,`async`/`await`提供了一种更优雅、可读的方法来处理异步操作,尽量避免直接阻塞主线程。如果你需要在UI线程上等待,请确保正确地使用`await`或者采用合适的事件通知机制。
阅读全文