Как использовать это. Dispose () из потока (не основной поток) - PullRequest
2 голосов
/ 28 июня 2019

Как я могу удалить WinForm из неосновного потока?

У меня есть несколько запущенных потоков, которые проверяются на .IsAlive из другого потока в цикле. Затем я пытаюсь избавиться от них после того, как они все умрут, но это не работает, как я предполагал, как мне правильно распоряжаться?

1 Ответ

1 голос
/ 28 июня 2019

Если вам нужно взаимодействовать с WinForms из потока, не являющегося пользовательским интерфейсом, вы можете использовать метод Invoke . В следующем примере создайте форму, покажите ее и затем вызовите dispose для нее

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();
    }
}

Как видите, делегат будет выполняться в потоке пользовательского интерфейса

...