使用字符串添加对象后,后台工作程序结果对象为空

时间:2013-04-30 17:29:14

标签: c# backgroundworker

我正在制作一个简单的WinForms程序,该程序应该从网站获得响应并测量处理所需的时间。

我不明白为什么e.Result在执行此操作后为空:e.Result = obj;

我从MSDN网站获得了网络请求代码,但我不确定它是否已正确实施。

这是为了启动后台工作人员:

    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的{​​{1}}参数为True。在backgroundWorker1开始并且RunWorkerCompleted为假

之后立即开始

EDIT2:已解决,IsBusy未在“属性”窗口的DoWork属性中键入。我不知道发生了什么,我首先在属性窗口中生成了backgroundWorker1_DoWork方法。无论如何,它现在有效。谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

如果在e.Result处理程序中发生异常或者操作被取消,RunWorkerCompleted中的DoWork属性将为null,但是取出它应该引发TargetInvocationException如果发生错误。

检查e.Error以查看是否存在例外情况,并e.Cancelled检查取消。

在旁注中,我怀疑您的Timer对象实际上应该是StopwatchTimer类用于安排要运行的事件,而不是测量时间。

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;
}