如何从线程(非主线程)使用 this.Dispose()
How to use this.Dispose() from a Thread (Not main thread)
如何从非主线程处理 WinForm?
我有几个线程 运行 从循环中的另一个线程中检查 .IsAlive
。然后我试着在他们都死后处理它们,但它没有像我想象的那样工作,我该如何正确处理?
如果您需要从 non-UI 线程与 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();
}
}
如您所见,委托将在 UI 线程
上执行
如何从非主线程处理 WinForm?
我有几个线程 运行 从循环中的另一个线程中检查 .IsAlive
。然后我试着在他们都死后处理它们,但它没有像我想象的那样工作,我该如何正确处理?
如果您需要从 non-UI 线程与 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();
}
}
如您所见,委托将在 UI 线程
上执行