Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在线程中调用Listbox_C#_.net_Windows_Visual Studio 2008 - Fatal编程技术网

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