gpt4 book ai didi

c# - 利用 BackGroundWorker 跨线程调用 Winforms 控件上的 GUI 操作?

转载 作者:太空宇宙 更新时间:2023-11-03 19:32:27 26 4
gpt4 key购买 nike

灵感来自于我自己使用多线程 Winforms 应用程序的经验,以及诸如此类的问题

我想出了一个非常简单的模式,我想验证一下它的可靠性。

基本上,我正在创建(并在应用程序的整个生命周期内运行)一个 BGW,其唯一目的是同步调用请求。考虑:

public MainForm()
{
InitializeComponent();
InitInvocationSyncWorker();
}

private void InitInvocationSyncWorker()
{
InvocationSync_Worker.RunWorkerAsync();
}

private void InvocationSync_Worker_DoWork(object sender, DoWorkEventArgs e)
{
Thread.Sleep(Timeout.Infinite);
}

void InvokeViaSyncWorker(Action guiAction)
{
InvocationSync_Worker.ReportProgress(0, guiAction);
}

private void InvocationSync_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (IsDisposed) return; //we're in the GUI thread now, so no race condition right?

var action = (Action) e.UserState;
action();
}

public void SomeMethodCalledFromAnyThread() //Sample usage
{
InvokeViaSyncWorker(() => MyTextBox.Text = "Hello from another thread!"));
}

诚然,这不是最经济的方法(像这样保持线程事件),但如果它有效并且我没有遗漏任何东西,那肯定是我见过的最简单的方法。

非常感谢您的反馈!

最佳答案

没有必要为此打开一个线程。只需使用 SynchronizationContext,如下所示:

private readonly SynchronizationContext _syncContext;

public MainForm()
{
InitializeComponent();

_syncContext = SynchronizationContext.Current;
}

void InvokeViaSyncContext(Action uiAction)
{
_syncContext.Post(o =>
{
if (IsHandleCreated && !IsDisposed) uiAction();
}, null);
}

public void SomeMethodCalledFromAnyThread() //Sample usage
{
InvokeViaSyncContext(() => MyTextBox.Text = "Hello from another thread!"));
}

关于c# - 利用 BackGroundWorker 跨线程调用 Winforms 控件上的 GUI 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4190299/

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