1

問題が発生しました。終了する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 が壊れている (確認できませんでした) というメッセージを表示します。

URLが正しいかどうかを確認し、応答を待っている「検証」部分を実行しようとしています。続行するには、検証プロセスのステータスが必要です。

4

2 に答える 2

1

試してみてください:

var task = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse,  
                                               request.EndGetResponse, null);
var response = task.Result;
于 2013-01-28T17:59:40.983 に答える
0

ManualResetEventSlim オブジェクトを使用できます。インスタンス化するときに true に初期化します。OnComplete メソッドの最後に、ManualResetEventSlim オブジェクトの Reset メソッドを呼び出します。メイン アプリケーションでは、ManualResetEventSlim オブジェクトで WaitOne メソッドを呼び出すだけです。

于 2013-01-28T17:48:06.097 に答える