【问题标题】:Using .FromAsync Task Status= WaitingForActivation使用 .FromAsync 任务状态= WaitingForActivation
【发布时间】:2013-06-28 19:53:57
【问题描述】:

我正在尝试异步发送 url 请求并获取响应,但是当我将 .fromAsync 方法与 .ContinueWith 方法一起使用时,任务状态永远不会从 WaitingForActivation 变为正在运行。我曾尝试使用 task.Start(),但它不能与 ContinueWith 一起使用。我将如何通过将任务状态更改为在我的代码中运行?

public void pageCheck(){
    IAsyncResult asyncResult;
    Uri uri = new Uri(TempURL); //TempUrl is assigned a string beforehand
    HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri);
    try{
        Task<WebResponse> task = Task.Factory.FromAsync(
            myReq.BeginGetResponse,
            asyncResult => myReq.EndGetResponse(asyncResult),
            (Object)null);

        task.ContinueWith(t =>
            {
                var responseCode = (HttpWebResponse)t.Result;
                ReadStreamFromResponse(t.Result);
                if(responseCode.StatusCode == HttpStatusCode.OK){
                    //updatestatus
                    reponseCode.Close();
                }
            }
        );
    }
    //catch exceptions
}

private String ReadStreamFromResponse(WebResponse response) {
     StreamReader responseStream = new StreamReader(response.GetResponseStream());
     string str = responseStream.ReadToEnd();
     return str;
 }

【问题讨论】:

  • 您在哪里以及如何检查任务的状态?在您的流程中,此时是否还有很多其他事情发生?
  • @ReedCopsey 我正在使用 VS2010 的“调试”选项卡中的“本地”功能来检查状态。此外,我在创建它之后以及在我调用的 continueWith 方法之后检查状态。除此之外没有发生太多事情,我创建了一个由 url 组成的列表,并且我正在通过每个循环遍历每一个。我将尝试进行您在下面所做的更改

标签: c# asynchronous scheduled-tasks task-parallel-library task


【解决方案1】:

Task.Factory.FromAsync 自动安排任务。来自the documentation

beginMethod 委托在运行 FromAsync 的线程上启动。此方法抛出 beginMethod 抛出的任何异常。

您通常会在没有 lambda 的情况下编写此代码:

Task<WebResponse> task = Task<WebResponse>.Factory.FromAsync(
        myReq.BeginGetResponse,
        myReq.EndGetResponse,
        null);

如果您使用的是 .NET 4.5 和 C# 5,您也可以直接使用 WebRequest.GetResponseAsync

【讨论】:

  • 当我尝试这个时,它告诉我以下方法或属性之间的调用不明确:System.Threading.Tasks.TaskFactory.FromAsync ....
  • 它似乎工作了谢谢。它的状态是我查找的故障,它说这意味着它由于未处理的异常(即 AggregateException)而完成。我会尽力解决这个问题。
  • @DeVonte 您需要在 ContinueWith 语句中检查任务的异常以查看导致故障的原因。
  • 错误似乎在这一行: var responseCode = (HttpWebResponse)t.Result;用户代码未处理 AggregateException
  • @DeVonte 当您获取Result 属性时,Task 将重新引发包含在 AggregateException 中的任何异常。见:msdn.microsoft.com/en-us/library/dd997415.aspx
猜你喜欢
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2019-12-28
  • 2020-08-04
  • 2018-04-08
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多