调用线程无法访问此对象,因为另一个线程拥有它有错误

时间:2015-10-23 07:14:03

标签: c# .net

我在一个.cs文件中有messagebox,我想在ok按钮点击时清除另一个.cs文件中的文本框。 我用过

System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() =>
{
      _upload._txtbxNotes.Text = "";
}));

解决线程问题。但它没有帮助我。它仍然显示相同的错误。 任何帮助表示赞赏。

更新

您好,我也更新了我的代码,但它没有更改文本框值。保持原样。我在进度栏的上传屏幕上还有一个帖子。

这是我的代码:FileUpload.cs

            if (String.Equals(objFileUploadResponse.responseCode, 102))
            {
                //  MessageBox.Show("File Uploaded Successfully");

                ipbup.ReportProgress(qpvsChunk);
                DialogResult dialogResult = System.Windows.Forms.MessageBox.Show("File Uploaded", "", MessageBoxButtons.OK);

                if (dialogResult == DialogResult.OK)
                {
                    _upload.SetNotes(" ");                                                                               
                }
            }
            else
            {
                System.Windows.MessageBox.Show("File Uploaded Failed");
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Upload.cs:

public void SetNotes(string note)
{
    _txtbxNotes.Dispatcher.Invoke(() =>
    {
        _txtbxNotes.Text = note;
    });
}

1 个答案:

答案 0 :(得分:2)

这可能是因为您正在另一个线程上运行。当您在另一个线程上调用System.Windows.Threading.Dispatcher.CurrentDispatcher时,它将创建一个新的Dispatcher。但是你不想要一个新的调度员,你想要使用“拥有”控制/窗口的Dispatcher

要解决此问题,您的控件/窗口具有Dispatcher属性。 (它引用它创建的Dispatcher)

您可以尝试:

// use the Dispatcher from the _upload control.
_upload._txtbxNotes.Dispatcher.Invoke(() =>
{
    _upload._txtbxNotes.Text = "";
}));

'更好'的方法可能是:在_upload类中创建一个名为的方法(例如) _upload.SetNotes(string note);这样就可以保持逻辑分离。今天你希望TextBox明天你可能需要一个Label。这样只会导致上传窗口/控件/类。

// for example:  (pseudo)

_upload.SetNotes("");


class UploadWindow
{
    // ......

    public void SetNotes(string note)
    {
        _txtbxNotes.Dispatcher.Invoke(() =>
        {
            _txtbxNotes.Text = note;
        }));
    }

}