【问题标题】:How to wait until the file is downloaded (or URL is validated)?如何等到文件下载(或 URL 验证)?
【发布时间】:2013-01-28 17:39:28
【问题描述】:

我有一个问题,我想在Main() 中等待,直到Download() 完成。但是,文件下载/检查开始,同时其他行开始执行。

如何使用await或其他任何东西在Main中等待?

    private void Main()
    {
       Download("http://webserver/file.xml");
       //Do something here ONLY if the file exists!!
    }


    //This method invokes the URL validation
    private void Download(downloadURL)
    {
       System.Uri targetUri = new System.Uri(downloadURL);
       HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(targetUri);
       request.BeginGetResponse(new AsyncCallback(WebRequestCallBack), request);
    }

    //In this method the URL is being checked for its validity
    void WebRequestCallBack(IAsyncResult result)
    {
        HttpWebRequest resultInfo = (HttpWebRequest)result.AsyncState;
        HttpWebResponse response;
        string statusCode;
        try
        {
            response = (HttpWebResponse)resultInfo.EndGetResponse(result);
            statusCode = response.StatusCode.ToString();
        }
        catch (WebException e)
        {
            statusCode = e.Message;
        }
        onCompletion(statusCode);
    }

    //This method does not help! I just added if it could be any useful
    private  void onCompletion(string status)
    {
        if (status == HttpStatusCode.OK.ToString())
            MessageBox.Show("file exists");  
        else
            MessageBox.Show("file does not exists");  
    }

我需要的,具体来说是……

  • 从给定的 URL 下载文件
  • 下载前验证网址
  • 如果(已验证)则
    • 继续下载并执行其他任务
  • 其他
    • 失败并停止进程,不要下载!并给出 URL 已损坏(无法验证)的消息!

我正在尝试执行“验证”部分,检查 URL 是否正确并等待响应。为了继续,我需要某种验证过程的状态。

【问题讨论】:

  • 任何原因//Do something here ONLY if the file exists!! 无法在WebRequestCallBackonCompletion 中完成?
  • .net 4.5 或更早的版本?
  • @Ginosaji 好吧,我只是简单地举个例子,不容易使用onCompletion。我需要代码的连续性。
  • @daryal 早期版本 .net 4.0
  • 您必须更详细地说明您需要什么。否则答案是:“使用同步版本”。

标签: c# windows-phone-7 windows-phone async-await


【解决方案1】:

应该试试:

var task = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse,  
                                               request.EndGetResponse, null);
var response = task.Result;

【讨论】:

  • 感谢 Cuong Le 的回复,但是没有可用的request.GetResponse() 方法,至少 WP7 没有
  • 直接调用BeginGetResponse()然后EndGetResponse()会简单很多。
  • 我正在使用上述解决方案,例如...Task&lt;WebResponse&gt; task = Task.Factory.FromAsync&lt;WebResponse&gt;(request.BeginGetResponse, request.EndGetResponse, null); task.ContinueWith((t) =&gt; { WebResponse webResponse = t.Result; var response = (HttpWebResponse)webResponse; responseString = response.StatusCode.ToString(); });...我总是得到空responseString,即使我传递了错误的 URL,它也不会崩溃!还没有工作! :)
【解决方案2】:

您可以使用 ManualResetEventSlim 对象。实例化时将其初始化为 true。在 OnComplete 方法结束时,对 ManualResetEventSlim 对象调用 Reset 方法。在您的主应用程序中,您只需在 ManualResetEventSlim 对象上调用 WaitOne 方法。

【讨论】:

  • 这是他想要的,但不是他需要的。 OP 不应该仅仅为了等待完成而使用异步 IO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
相关资源
最近更新 更多