方法一:
像 Tigran 描述的那样使用 Invoke。
对于 Winforms,这看起来像:
Thread t = new Thread(() =>
{
if (!Dispatcher.CurrentDispatcher.CheckAccess())
{
Dispatcher.CurrentDispatcher.BeginInvoke(
new Action(() =>
{
foreach (ListViewItem row in listView1.Items)
{
row.SubItems[0].Text = "Checking";
Thread.Sleep(2000);
}
}),
DispatcherPriority.ApplicationIdle,
null);
}
else
{
foreach (ListViewItem row in listView1.Items)
{
row.SubItems[0].Text = "Checking";
Thread.Sleep(2000);
}
}
});
t.Start();
如果从 UI 线程调用 CheckAccess() 调用,则返回 true,否则返回 false。
Dispatcher 类位于“WindowsBase”NET 中的“System.Windows.Threading”命名空间中。集会
调度员信息复制自:https ://stackoverflow.com/a/4429009/1469035
编辑:将代码更改为 WinForms。编辑:代码已修复。
方法二:
使用回调:
未经测试的代码:
public partial class Form1 : Form
{
private delegate void SetCallback(ListViewItem row, string text);
public Form1()
{
InitializeComponent();
}
private void SomeMethod()
{
Thread t = new Thread(() =>
{
foreach (ListViewItem row in listView1.Items)
{
if (listView1.InvokeRequired)
{
SetCallback d = new SetCallback(SetText);
this.Invoke(d, new object[] { row, "Checking" });
}
Thread.Sleep(2000);
}
});
t.Start();
}
private void SetText(ListViewItem row, string text)
{
row.SubItems[0].Text = text;
}
}
Winforms 中允许从 UI 线程以外的线程对控件进行只读访问。因此,您可以检查所需的任何控制属性并将所需的信息传递给代表。
即使 Reading doents 以这种方式工作,您也可以创建另一个具有返回值的 Delegate。Invoke() 方法返回一个对象:
与此类似:
private delegate object GetCallback(ListViewItem row);
private object o;
...
GetCallback g = new GetCallback(GetText);
o = this.Invoke(g, new object[] { row });
private string GetText(ListViewItem row)
{
return row.SubItems[0].Text;
}
来源于: 链接