gpt4 book ai didi

c# - 从原始线程调用事件?

转载 作者:行者123 更新时间:2023-11-30 15:48:27 25 4
gpt4 key购买 nike

这是我的问题,我有一个类,它有一个抛出事件的对象,在这个事件中,我从我的类中抛出一个自定义事件。但不幸的是,原始对象从另一个线程抛出事件,所以我的事件也是在另一个线程上抛出的。当我的自定义事件尝试从控件访问时,这会导致异常。

这是一个代码示例,可以更好地理解:

class MyClass
{
// Original object
private OriginalObject myObject;

// My event
public delegate void StatsUpdatedDelegate(object sender, StatsArgs args);
public event StatsUpdatedDelegate StatsUpdated;

public MyClass()
{
// Original object event
myObject.DoSomeWork();
myObject.AnEvent += new EventHandler(myObject_AnEvent);
}

// This event is called on another thread while myObject is doing his work
private void myObject_AnEvent(object sender, EventArgs e)
{
// Throw my custom event here
StatsArgs args = new StatsArgs(..........);
StatsUpdated(this, args);
}
}

因此,当我在 Windows 窗体上调用尝试从事件 StatsUpdated 更新控件时,我得到一个跨线程异常,因为它已在另一个线程上调用。

我想做的是在原始类线程上抛出我的自定义事件,因此可以在其中使用控制。

谁能帮帮我?

最佳答案

你可以看看 InvokeRequired/Invoke模式。

在尝试更新某些控件之前,您检查是否需要调用并使用 Invoke 方法,该方法将负责编码(marshal)对创建此控件的线程的调用:

Control ctrlToBeModified = // 
if (ctrlToBeModified.InvokeRequired)
{
Action<Control> del = (Control c) =>
{
// update the control here
};
ctrlToBeModified.Invoke(del, ctrlToBeModified);
}

更新:

private void myObject_AnEvent(object sender, EventArgs e)
{
// Throw my custom event here
StatsArgs args = new StatsArgs(..........);
Control control = // get reference to some control maybe the form or 'this'
if (control.InvokeRequired)
{
Action<Control> del = (Control c) =>
{
// This will invoke the StatsUpdated event on the main GUI thread
// and allow it to update the controls
StatsUpdated(this, args);
};
control.Invoke(del);
}
}

关于c# - 从原始线程调用事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2599933/

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