常规的async/await如下:

static void Main(string[] args)
{
    Console.WriteLine("-------主线程启动-------");
    Task<int> task = GetStrLengthAsync();
    Console.WriteLine("主线程继续执行");
    Console.WriteLine("Task返回的值" + task.Result);
    Console.WriteLine("-------主线程结束-------");
}
 
static async Task<int> GetStrLengthAsync()
{
    Console.WriteLine("GetStrLengthAsync方法开始执行");
    //此处返回的<string>中的字符串类型,而不是Task<string>
    string str = await GetString();
    Console.WriteLine("GetStrLengthAsync方法执行结束");
    return str.Length;
}
 
static Task<string> GetString()
{
   //Console.WriteLine("GetString方法开始执行")
    return Task<string>.Run(() =>
    {
        Thread.Sleep(2000);
        return "GetString的返回值";
    });
}

上面的方法不能满足回调逻辑,于是就有了下面这段代码:

private Action<Pb.RespEntry> cb = null;

/// <summary>
/// 发送消息
/// </summary>
public Task<RespEntry> Send()
{
    var tsc = new TaskCompletionSource<Pb.RespEntry>();
    cb = (Pb.RespEntry pbE) =>
    {
        if (pbE == null)
        {
            tsc.SetException(new Exception($"Entry error"));
        }
        else
        {
            tsc.SetResult(pbE);
        }
    };

    Pb.ReqEntry entry = new Pb.ReqEntry();
    Entry.WebRequest.AddWebRequest(Constant.Http.Entry, entry.ToByteArray(), this);

    return tsc.Task;
}

/// <summary>
/// Web请求的监听
/// 在监听里面执行回调逻辑
/// </summary>
private void OnWebRequest()
{
    if (cb != null)
    {
        cb();
    }
}

通过上面的方法,可以将观察者模式,改成async/await