gpt4 book ai didi

Winforms 线程问题,第二个线程无法访问第一个主窗体控件

转载 作者:行者123 更新时间:2023-12-03 05:20:26 25 4
gpt4 key购买 nike

我有一个 winforms 应用程序,问题与线程有关。因为我正在调用“MyCustomCode()”,它创建了一个新线程,并调用该方法'SomeMethod()' 然后访问 MessageBox.Show(...)。

问题与线程有关,因为新创建的线程正在尝试访问在另一个线程上创建的控件。

我收到错误:

跨线程操作无效:从创建它的线程以外的线程访问控制“TestForm”。

public TestForm()
{
InitializeComponent();


// custom code
//
MyCustomCode();


}

public void SomeMethod()
{

// ***** This causes an error ****

MessageBox.Show(this,
ex.Message,
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}



private void InitializeAutoUpdater()
{
// Seperate thread is spun to keep polling for updates
ThreadStart ts = new ThreadStart(SomeMethod);
pollThread = new Thread(ts);
pollThread.Start();
}

更新

如果你看看这个例子http://www.codeproject.com/KB/cs/vanillaupdaterblock.aspx ,方法 CheckAndUpdate 正在调用 MessageBox.Show(..) 这就是我的问题所在。我本以为代码已经很好用了!

有趣的事情是这段代码在周五运行得很好???

最佳答案

您无法从多个线程访问 UI 元素。

解决此问题的一种方法是调用控件的 Invoke 方法,并将其委托(delegate)给使用 UI 元素(如消息框)的函数。类似于:

public delegate void InvokeDelegate();

public void SomeMethod()
{

button1.Invoke((InvokeDelegate)doUIStuff);


}


void doUIStuff()
{
MessageBox.Show(this,
ex.Message,
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
}

关于Winforms 线程问题,第二个线程无法访问第一个主窗体控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/149394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com