C# 主线程main函数如何调用 async task<T> await ,以及不阻塞主线程如何得取返回值?请举例
时间: 2024-09-26 22:02:06 浏览: 78
在C#中,当你有一个异步任务(Async Task)想要在主线程的`Main`函数中执行,并等待其完成时,通常你会使用`await`关键字。`async`和`await`一起工作,使得异步操作感觉像同步操作一样,不会阻塞主线程。
以下是一个简单的例子:
```csharp
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// 创建一个异步任务
var longRunningTask = LongRunningOperation();
try
{
// 使用await关键字等待任务完成
Console.WriteLine("Starting operation...");
await longRunningTask; // 这里并不会阻塞主线程
Console.WriteLine("Operation completed.");
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
// 定义一个模拟耗时操作的任务
static async Task<LongResultType> LongRunningOperation()
{
await Task.Delay(2000); // 模拟长时间运行
return "Long running operation result";
}
}
// 注意:`LongResultType`是你需要从异步任务获取结果的类型,这里是字符串类型作为示例
```
在这个例子中,`LongRunningOperation`方法内部使用了`await Task.Delay`来表示一个模拟的长期操作。当我们在`Main`函数中调用`await longRunningTask`时,程序会继续执行下面的代码,而不会等待`LongRunningOperation`完成。当`LongRunningOperation`执行完毕并返回结果时,`await`表达式会自动解析这个结果。
要获取异步任务的返回值,你需要将`async`方法声明为返回一个`Task`或具体的返回类型(如`Task<String>`),然后在`await`语句之后访问它。例如,上面的`LongRunningOperation`返回的是一个字符串,所以在`Main`函数中可以直接使用`longRunningTask.Result`来取得返回值,但这可能会抛出`AggregateException`如果任务在运行时失败,所以通常推荐使用`await`语句的`Value`属性或者`GetAwaiter().GetResult()`来处理。不过,在实际生产环境中,更倾向于使用`try-catch`块来捕获潜在的异常。
阅读全文