【问题标题】:Background Worker Result object is null after adding object with strings使用字符串添加对象后,后台工作人员结果对象为空
【发布时间】:2013-04-30 17:29:13
【问题描述】:

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

我不明白为什么e.Result 在执行此操作后为空: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(); 可能是问题所在。完成后,backgroundWorker1IsBusy 参数为 True。在 RunWorkerCompleted 开始并且 IsBusy 为 False 之后立即

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

【问题讨论】:

  • 您能更好地描述实际问题吗?有什么例外?床单号?
  • 您的整个webRespones() 可以通过一次调用WebClient.DownloadString() 来替换
  • RunWorkerCompleted 方法中 label1.Text = test.Request + test.Time; 处的异常为 NullReferenceException
  • 然后使用调试器。您的代码有几个问题,但没有一个会在此处产生null
  • (在此继续)。 Completed 开头的消息框是否显示?并检查label1

标签: c# backgroundworker


【解决方案1】:

如果在 DoWork 处理程序期间发生异常或操作被取消,则 RunWorkerCompleted 中的 e.Result 属性将为 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;
}

【讨论】:

  • 出现异常时读取e.Result会抛出异常。
  • @HenkHolterman 是的 - 但不清楚“它是 null”是否意味着他正在获取 NullReferenceException 或读取 null 的值...
  • 感谢您的信息!我忘了提到我在 label1.Text = test.Request + test.Time 处得到 NullReferenceException;在 RunWorkerCompleted 方法中
  • @imot01 调试时 - “测试”变量是 null,还是 label1?
  • @Henk Holterman 它没有。没有 e.Error 和 e.Cancelled 这样的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多