C# 如果使用invoke从另一个线程更新表单,如何正确关闭winform
我有一个从回调接口订阅事件的winform。我用C# 如果使用invoke从另一个线程更新表单,如何正确关闭winform,c#,multithreading,winforms,C#,Multithreading,Winforms,我有一个从回调接口订阅事件的winform。我用 public partial class Form1 : Form { MyTestCallBack _callback; public Form1() { InitializeComponent(); //Start otherthread API.Create() _callback = new MyTestCallBack();
public partial class Form1 : Form
{
MyTestCallBack _callback;
public Form1()
{
InitializeComponent();
//Start otherthread
API.Create()
_callback = new MyTestCallBack();
_callback.MyTestCallBackEvent += callback_MyTestCallBackEvent;
_callback.OnUpdate();
}
private callback_MyTestCallBackEvent(MyTestCallBackEventArgs e)
{
if (InvokeRequired)
{
Invoke(new Action(() =>
{
callback_MyTestCallBackEvent(sender, e);
}));
return;
}
label1.Text = e.SomeObject.GetDisplayString();
} }
class MyTestCallBackEventArgs : EventArgs {
public SomeObject SomeObj { get; set; } }
class MyTestCallBack : Callback {
public event EventHandler<MyTestCallBackEventArgs> MyTestCallBackEvent;
protected virtual void OnMyTestCallBackEvent(MyTestCallBackEventArgs e)
{
if (MyTestCallBackEvent != null)
MyTestCallBackEvent(this, e);
}
public void OnUpdate(SomeObject someobj)
{
OnMyTestCallBackEvent(new MyTestCallBackEventArgs { SomeObject = someobj });
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//tried this but still crashes
_callback.MyTestCallBackEvent -= callback_MyTestCallBackEvent;
API.Destroy()
}
公共部分类表单1:表单
{
MyTestCallBack\u callback;
公共表格1()
{
初始化组件();
//启动其他线程
API.Create()
_callback=新的MyTestCallBack();
_callback.MyTestCallBackEvent+=callback\u MyTestCallBackEvent;
_callback.OnUpdate();
}
私有回调\u MyTestCallBackEvent(MyTestCallBackEventArgs e)
{
如果(需要调用)
{
调用(新操作(()=>
{
callback_MyTestCallBackEvent(发送方,e);
}));
返回;
}
label1.Text=e.SomeObject.GetDisplayString();
} }
类MyTestCallBackEventArgs:EventArgs{
公共SomeObject SomeObj{get;set;}
类MyTestCallBack:Callback{
公共事件处理程序MyTestCallBackEvent;
MyTestCallbackEvent(MyTestCallBackEventArgs e)上受保护的虚拟无效
{
if(MyTestCallBackEvent!=null)
MyTestCallBackEvent(这个,e);
}
public void OnUpdate(SomeObject someobj)
{
OnMyTestCallBackEvent(新的MyTestCallBackEventArgs{SomeObject=someobj});
}
}
私有作废Form1\u FormClosing(对象发送方,FormClosingEventArgs e)
{
//尝试过这个,但仍然崩溃
_callback.MyTestCallBackEvent-=callback\u MyTestCallBackEvent;
API.Destroy()
}
当我试图关闭表单时,它崩溃了。“冻结”。我认为这是因为另一个线程没有正确关闭
如何安全地取消订阅此活动,以便正确关闭。要立即取消订阅此活动,请使用:
_callback.MyTestCallBackEvent -= callback_MyTestCallBackEvent;
在我看来,这里只涉及一个线程?当您第一次点击回调时,
invokererequired
是否为真?只需选中“是”,它就会返回真值。我没有包括,但我需要使用API.Create()启动另一个线程。这需要停止方法API.Destroy()。我想你需要在你的问题中包含这些细节-它们可能与此相关,我错了!关闭主窗体后,单击Visual Studio中的“暂停”按钮以查看正在执行的代码。我猜你的帖子还在做什么。如果要在主窗体关闭时停止线程,则必须将其IsBackground
设置为true。我已在窗体关闭事件中执行了此操作,但它仍然崩溃