2

WinFormsWeb サイトからの応答を取得し、処理に必要な時間を測定する簡単なプログラムを作成しています。

e.Resultこれを行った後、なぜnullなのかわかりません:e.Result = obj;

MSDN サイトから Web 要求コードを取得しましたが、正しく実装されているかどうかわかりません。

これは、バックグラウンド ワーカーを開始するためのものです。

    private void button1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
    }

文字列を処理するクラス:

    public class TestObject
    {
        public string Request { get; set; }
        public string Time { get; set; }
    }

DoWork メソッド:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
         TestObject obj = new TestObject();

        var stopwatch = System.Diagnostics.Stopwatch.StartNew();
        obj.Request = webResponse();

        stopwatch.Stop();

        obj.Time = stopwatch.Elapsed.ToString();


        e.Result = obj;
    }

RunWorkerCompleted メソッド:

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        TestObject test = e.Result as TestObject;
        label1.Text = test.Request + test.Time;
    }

ウェブリクエストコード

    private string webResponse()
    {
        // Create a request for the URL.        
        WebRequest request = WebRequest.Create("http://www.tvz.hr");

        // Get the response.
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        // Display the status.

        // Get the stream containing content returned by the server.
        Stream dataStream = response.GetResponseStream();

        // Open the stream using a StreamReader for easy access.
        StreamReader reader = new StreamReader(dataStream);

        // Read the content. 
        string responseFromServer = reader.ReadToEnd();

        // Cleanup the streams and the response.
        reader.Close();
        dataStream.Close();
        response.Close();

        return responseFromServer;
    }

編集: これは表示されるエラーですhttp://i.imgur.com/Sb5BDFe.jpg ストップウォッチの部分を編集しました。それが問題になる可能性があると思いますbackgroundWorker1.RunWorkerAsync();。完了すると、のIsBusyパラメーターbackgroundWorker1は True になります。RunWorkerCompletedそして開始直後IsBusyはFalse

EDIT2: 解決済み、[プロパティ]backgroundWorker1_DoWorkウィンドウの DoWork プロパティに入力されませんでした。それがどのように起こったのかわかりませんbackgroundWorker1_DoWork。最初にプロパティウィンドウでメソッドを生成しました。とにかく、それは今動作します。すべての助けに感謝します!

4

1 に答える 1

4

ハンドラー中に例外が発生した場合、または操作がキャンセルされた場合、内のe.ResultプロパティRunWorkerCompletedは null になりますが、エラーが発生しDoWorkた場合は、それを取得する必要がTargetInvocationExceptionあります。

e.Error例外の有無e.Cancelled、キャンセルの有無をご確認ください。

ちなみに、あなたのTimerオブジェクトは実際にはStopwatch. このTimerクラスは、タイミングを測定するのではなく、実行するイベントをスケジュールすることを目的としています。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
    TestObject obj = new TestObject();
    obj.Request = webResponse();
    stopwatch.Stop();
    obj.Time = stopwatch.Ellapsed.ToString();
    e.Result = obj;
}
于 2013-04-30T17:37:25.323 に答える