Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果使用invoke从另一个线程更新表单,如何正确关闭winform_C#_Multithreading_Winforms - Fatal编程技术网

C# 如果使用invoke从另一个线程更新表单,如何正确关闭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();

我有一个从回调接口订阅事件的winform。我用

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。我已在窗体关闭事件中执行了此操作,但它仍然崩溃