【问题标题】:Failing to catch the response from Task.Factory.FromAsync未能捕捉到来自 Task.Factory.FromAsync 的响应
【发布时间】:2017-08-14 16:39:42
【问题描述】:

我有这个对象

public class ObjectList
{
    public string idreturn { get; set; }
}

在使用Task.Factory.FromAsync 运行异步请求时,我无法捕获响应

foreach (var obj in ObjectList)
{
    var wreq = (HttpWebRequest)WebRequest.Create(Convert.ToString(getURL));
    var taskResp = Task.Factory.FromAsync<WebResponse>(wreq.BeginGetResponse, wreq.EndGetResponse, null);
    taskResp.ContinueWith(tsk => new StreamReader(tsk.Result.GetResponseStream()).ReadToEnd().Trim())
            .ContinueWith((Task<string> trs) => {
                obj.idreturn = trs.Result.ToString();
            });
}

return JsonHelper.JsonSerializer(ObjectList);

我错过了什么?

【问题讨论】:

  • 你有什么异常吗?如果是,请包括异常详细信息/堆栈跟踪。

标签: c# sql


【解决方案1】:

您正在启动一个异步操作,然后在异步操作完成之前继续并序列化对象。

而不是使用ContinueWith,您应该使用awaitFromAsync 返回的值来获取结果,这样其余代码在请求完成之前不会继续执行。如果您希望请求全部并行发生,您可以构建所有任务,然后在请求全部完成后await Task.WhenAll 运行序列化代码。

【讨论】:

  • 我应该如何在这段代码中实现“等待”?对于: var taskResp = await Task.Factory.FromAsync(wreq.BeginGetResponse, wreq.EndGetResponse, null);我得到:错误 CS4032 'await' 运算符只能在异步方法中使用。考虑使用 'async' 修饰符标记此方法并将其返回类型更改为 'Task'.WebRequestCLR.sqlproj
  • @YanivBenYohana 如果您完全不熟悉它,您应该阅读有关该主题的教程。涵盖您需要知道的所有内容超出了单个 SO 答案的范围。您拥有的代码正是您需要做的,是的,您对代码的错误准确地告诉您还需要更改什么。
【解决方案2】:

感谢 James Manning 在Getting the Response of a Asynchronous HttpWebRequest 问题中的回答,我终于解决了问题。

  var task = MakeAsyncRequest(getURL);
  obj.smsidreturn = task.Result;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2019-08-03
    • 2017-05-20
    相关资源
    最近更新 更多