不清楚要通过给定的 Action<T,R>

Unclear about what to pass through a given Action<T,R>

我正在尝试在 .NET Core 应用程序中实现库 RestSharp.Core;但是它没有文档。

我需要实现这个方法;

public virtual RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback, string httpMethod)

我不知道要为第二个参数传递什么。这是我在正常 RestSharp 中使用的代码,然后我不得不开始将其转换为 .NET Core。

var httpResponse = await httpClient.ExecutePostTaskAsync(httpRequest);
var deserializer = new RestSharp.Deserializers.JsonDeserializer();
return deserializer.Deserialize<Dictionary<string, string>>(httpResponse);

有什么想法吗?我真的很困惑。

第二个参数是一个Action(方法),它接受一个RestRequestAsyncHandle和returns一个IRestResponse

换句话说,这个方法正在寻找一个方法,当它完成时作为回调来调用。

RestSharp 使用回调式异步,这在其他平台(例如 Node)中很常见,但从未在 .NET 中真正流行起来。

为了实现ExecuteAsyncPost,你需要使用requesthttpMethod参数来启动异步post 然后 return 一个 RestRequestAsyncHandle 表示该操作。

然后,当 post 完成时,您应该构建一个 IRestResponse 实例并将其与 RestRequestAsyncHandle 一起传递给 callback。您传递给 callbackRestRequestAsyncHandle 应该与您已经 return 从 ExecuteAsyncPost 编辑的实例相同。

由于 RestRequestAsyncHandle 似乎是围绕 HttpWebRequest 构建的,您应该可以执行以下操作:

public override RestRequestAsyncHandle ExecuteAsyncPost(IRestRequest request, Action<IRestResponse, RestRequestAsyncHandle> callback, string httpMethod)
{
  HttpWebRequest webRequest = /* Construct webRequest from request/httpMethod */
  var result = new RestRequestAsyncHandle(webRequest);
  DoWebRequest(webRequest, result, callback);
}

private async void DoWebRequest(HttpWebRequest webRequest, RestRequestAsyncHandle result, Action<IRestResponse, RestRequestAsyncHandle> callback)
{
  IRestResponse response;
  try
  {
    var webResponse = await webRequest.GetResponseAsync().ConfigureAwait(false);
    response = /* Construct an IRestResponse using webResponse */
  }
  catch (Exception ex)
  {
    response = /* Construct an IRestResponse with error information */
  }
  callback(response, result);
}

请注意,我在这里故意使用 async void,因为我们正在实现一个基于回调的异步系统,并且我 希望 回调方法的异常是在顶层处理。在绝大多数正常的async/await用法中,你应该避免async void.