c# - 事件未在表单中正确引发

标签 c# .net wpf multithreading events

我有一个带有事件处理程序的主窗口,它不能正常工作。我已经制作了这个问题的简单模型。请在问题所在的代码中查看注释:

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();

    }

}

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

最佳答案

问题是您从后台线程调用事件。这将不起作用,并且程序在尝试访问 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"); 
});

它会为你工作。

关于c# - 事件未在表单中正确引发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15210016/

相关文章:

c# - iComparable 接口(interface)工作

c# - 使用 "new() and ".StartNew()"创建新实例有什么区别?

wpf - MVVM 将 RelayCommand CanExecute 绑定(bind)到属性?

c# - 在辅助监视器上最大化时设置 wpf 应用程序屏幕高度

c# - 如何在 Xamarin Forms 上刷新或召回页面

c# - 如何在不超出范围的情况下从列表中删除多个条目?

c# - 如何将多个对象传递到 IEnumerable 列表中?

asp.net - 关于Email Verification - 有哪些方式

c# - MVVM 绑定(bind)到 Properties.Settings

c# - 为什么我会收到 ""对象“不包含 "Index"的定义”错误?