using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 同步异步互调
{
class Program
{
static void Main(string[] args)
{
var p = new Program();
p.DoSyncWork();// 同步方法调用异步方法
Task s = p.DoAsyncWork(); // 异步调用同步
s.Wait();// 上一句是异步,必须等待,否则异步还没执行完,主main就已经结束了
//Console.ReadKey();
}
/// <summary>
/// 一个同步方法 如何调用异步
/// </summary>
public void DoSyncWork()
{
// 创建异步任务
Task<int> asyncTask = SomeAsyncMethod();
//同步等待任务完成
asyncTask.Wait();
// 获取异步操作的结果
int result = asyncTask.Result;
// 在这里继续处理结果...
}
// 虚拟的异步方法
public async Task<int> SomeAsyncMethod()
{
// 使用异步操作等待一段时间,模拟真实的异步计算
await Task.Delay(1000);
// 返回一些异步计算的结果
return 42;
}
// 异步调用同步
public async Task DoAsyncWork()
{
await Task.Run(() =>
{
// 执行同步代码...
var r = SyncMethod();
// 注意:避免在同步操作中使用阻塞调用,以免降低异步代码的性能
Console.WriteLine($"{r}");
});
// 继续执行异步操作或处理结果...
}
// 同步耗时方法
public string SyncMethod()
{
Thread.Sleep(3000);
Console.WriteLine($"ThreadId:{Thread.CurrentThread.ManagedThreadId}");
return "完成";
}
}
}