C# 如何等待文件下载(或URL验证)?

C# 如何等待文件下载(或URL验证)?,c#,windows-phone-7,windows-phone,async-await,C#,Windows Phone 7,Windows Phone,Async Await,我有一个问题,我想在Main()中等待Download()完成。但是,文件下载/检查开始,同时其他行开始执行 如何使用wait或Main中要等待的任何内容 private void Main() { Download("http://webserver/file.xml"); //Do something here ONLY if the file exists!! } //This method invokes the URL v

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

如何使用
wait
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已损坏(无法验证)的消息

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

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

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

应尝试:

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

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


任何原因
//仅当文件存在时才在此处执行操作
无法在
WebRequestCallBack
onCompletion
?.net 4.5或更早版本中完成@Ginosaji好吧,我只是以简单的形式给出了示例,不容易使用
onCompletion
。我需要代码的连续性。@daryal早期版本.net 4.0您必须更详细地解释您需要什么。否则答案是:“使用同步版本”。任何原因
//仅当文件存在时才在此处执行操作
无法在
WebRequestCallBack
onCompletion
?.net 4.5或更早版本中完成@Ginosaji好吧,我只是以简单的形式给出了示例,不容易使用
onCompletion
。我需要代码的连续性。@daryal早期版本.net 4.0您必须更详细地解释您需要什么。否则答案是:“使用同步版本”。感谢Cuong Le的回复,但是没有可用的
请求。GetResponse()
方法,至少WP7不需要直接调用
BeginGetResponse()
,然后
EndGetResponse()
会简单得多。我使用上面的解决方案,就像<代码>任务任务=Task.Factory.fromsync(request.BeginGetResponse,request.EndGetResponse,null);task.ContinueWith((t)=>{WebResponse WebResponse=t.Result;var response=(HttpWebResponse)WebResponse;responseString=response.StatusCode.ToString();})。。。我总是得到空的
responseString
,即使我传递了错误的URL,它也不会崩溃!还没开始工作!:)感谢Cuong Le的回复,但是没有
请求。GetResponse()
方法可用,至少WP7不需要直接调用
BeginGetResponse()
,然后
EndGetResponse()
会简单得多。我使用上面的解决方案,就像<代码>任务任务=Task.Factory.fromsync(request.BeginGetResponse,request.EndGetResponse,null);task.ContinueWith((t)=>{WebResponse WebResponse=t.Result;var response=(HttpWebResponse)WebResponse;responseString=response.StatusCode.ToString();})。。。我总是得到空的
responseString
,即使我传递了错误的URL,它也不会崩溃!还没开始工作!:)这是他想要的,但不是他需要的。OP不应该仅仅为了等待完成而使用异步IO。这是他想要的,但不是他需要的。OP不应该仅仅为了等待完成而使用异步IO。