C# 在线程中调用Listbox
我试图让我的列表框在我的线程结束时自行清除它。我在调用它时遇到了问题,希望有人能告诉我怎么做C# 在线程中调用Listbox,c#,.net,windows,visual-studio-2008,C#,.net,Windows,Visual Studio 2008,我试图让我的列表框在我的线程结束时自行清除它。我在调用它时遇到了问题,希望有人能告诉我怎么做 public delegate void ClearDelegate(ListBox lb); public void ItemClear(ListBox lb) { if (lb.InvokeRequired) { lb.Invoke(new ClearDelegate(ItemCle
public delegate void ClearDelegate(ListBox lb);
public void ItemClear(ListBox lb)
{
if (lb.InvokeRequired)
{
lb.Invoke(new ClearDelegate(ItemClear), new Object[] { lb });
}
listBox1.Items.Clear();
}
Listbox只能由UI线程而不是工作线程访问
var sync = SynchronizatoinContext.Current;
sync.Post(delegate {
// Perform UI related changes here
}, null) //as the worker thread cannot access the UI thread resources
使用它自己的线程的非常简单的例子(注意只是为了显示,这里最好是一个
后台工作人员
!):
根据
只需放置listBox1.Items.Clear()将代码>语句转换为else
语句
另一件事是,您可以使用异步方法BeginInvoke
,该方法不会阻止线程等待方法完成。看起来不错,错误是什么?我认为错误是我仍然不理解如何正确使用线程。我现在正在检查它们。我得到了_Thread.Resume和_Thread.Suspend添加/更改的ManualResetEvent的折旧错误_event=new ManualResetEvent(true)_event.Reset();和_event.Set()@user2190928:这是注意标志的一个原因。奥利弗,那么我可以使用if((_-Thread.ThreadState)==ThreadState.Stopped)MessageBox.Show(“done”);}在我的按钮中,当它停止时会发生什么?你确定吗?那么Invoke
和BeginInvoke
方法呢?
private Thread _Thread;
public Form1()
{
InitializeComponent();
_Thread = new Thread(OnThreadStart);
}
private void OnButton1Click(object sender, EventArgs e)
{
var state = _Thread.ThreadState;
switch (state)
{
case ThreadState.Unstarted:
_Thread.Start(listBox1);
break;
case ThreadState.WaitSleepJoin:
case ThreadState.Running:
_Thread.Suspend();
break;
case ThreadState.Suspended:
_Thread.Resume();
break;
}
}
private static void OnThreadStart(object obj)
{
var listBox = (ListBox)obj;
var someItems = Enumerable.Range(1, 10).Select(index => "My Item " + index).ToArray();
foreach (var item in someItems)
{
listBox.Invoke(new Action(() => listBox.Items.Add(item)));
Thread.Sleep(1000);
}
listBox.Invoke(new Action(() => listBox.Items.Clear()));
}