2

我有一个带有事件处理程序的 MainWindow 无法正常工作。我已经为这个问题做了简单的模型。请查看问题所在代码中的注释:

public partial class MainWindow : Window
{
    public event EventHandler Event1;

    public MainWindow()
    {
        Event1 += MainWindow_Event1;
        InitializeComponent();
    }

    void MainWindow_Event1(object sender, EventArgs e)
    {
        textBox1.Text = "wth!?";  //Not changing text box. Not showing message. If delete this line, it will work fine
        MessageBox.Show("raised");  
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        EventHandler evt = Event1;
        while (true)
        {
            Thread.Sleep(500);
            evt(null, null);
        }
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.DoWork += bw_DoWork;
        bw.RunWorkerAsync();

    }

}

请解释这种行为,我该如何解决?

4

3 回答 3

3

问题是您正在从后台线程调用事件。这将不起作用,并且在尝试访问TextBox. 但是,如果您更改此代码:

textBox1.Text = "wth!?";  //Not changing text box. Not showing message. If delete this line, it will work fine
MessageBox.Show("raised"); 

对此:

this.Dispatcher.BeginInvoke((Action)delegate()
{
    textBox1.Text = "wth!?";  //Not changing text box. Not showing message. If delete this line, it will work fine
    MessageBox.Show("raised"); 
});

它会为你工作。

于 2013-03-04T20:02:32.017 回答
2

您无法从后台线程更新 UI 元素。 工作线程在尝试访问 UI 元素(Text 属性)时因异常而失败。所以 messageBox 也没有显示出来。使用通知机制或 Dispatcher 调用(网络上存在大量此类信息)

以下是可能的重复项/帮助:

使用 BackgroundWorker 更新 GUI

从后台工作人员或事件更新 GUI

于 2013-03-04T20:00:47.263 回答
1

这个问题是因为你需要使用当前线程的同步上下文来进行线程之间的通信,像这样

private void Button_Click(object sender, RoutedEventArgs e)
    {
        var sync = SynchronizationContext.Current;
        BackgroundWorker w = new BackgroundWorker();
        w.DoWork+=(_, __)=>
            {  
                //Do some delayed thing, that doesn't update the view
                sync.Post(p => { /*Do things that update the view*/}, null);
            };
        w.RunWorkerAsync();
    }

请检查这个问题,希望可以帮助...

于 2013-03-04T20:31:54.470 回答