如何从线程(不是主线程)使用this.Dispose()

时间:2019-06-28 09:54:09

标签: c# multithreading winforms dispose

如何从非主线程处理WinForm?

我有几个正在运行的线程,它们正在循环中的另一个线程中进行检查.IsAlive。然后我尝试在它们全部死亡后对其进行处置,但是它没有按照我的设想工作,如何正确处置?

1 个答案:

答案 0 :(得分:1)

如果需要通过非UI线程与WinForms进行交互,则可以使用Invoke方法。下一个示例创建一个表单,显示该表单,然后对其进行调用

public class DisposeFormDemo
{
    private class MyForm : Form
    {
        public MyForm() => Text = $"Main thread id = {Thread.CurrentThread.ManagedThreadId}";
    }

    public delegate void MyDelegate(Form form);

    public static void Main()
    {
        var form = new MyForm();

        Task.Run(async () => await Task.Delay(3000).ContinueWith(_ =>
        {
            MessageBox.Show($"Task thread id = {Thread.CurrentThread.ManagedThreadId}");

            var myDelegate = new MyDelegate(f =>
            {
                MessageBox.Show($"Current thread id = {Thread.CurrentThread.ManagedThreadId}");
                f.Dispose();
            });
            form.Invoke(myDelegate, form);
        }));

        form.ShowDialog();
    }
}

如您所见,委托将在UI线程上执行