3

スレッドの最後でリストボックスを自分でクリアしようとしています。私はそれを呼び出すのに問題があり、誰かが私にその方法を教えてくれることを望んでいました.

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

        }
4

3 に答える 3

5

独自のスレッドを使用した非常に些細な例 (表示するためだけに注意してください。ここではBackgroundWorker!):

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()));
}
于 2013-07-10T10:59:05.717 に答える
0

MSDNのドキュメントによると、listBox1.Items.Clear();ステートメントをステートメント に入れるだけで十分elseです。

もう1つのことはBeginInvoke、スレッドをブロックしない非同期メソッドを使用して、メソッドの終了を待つことができることです。

于 2015-12-10T12:23:30.387 に答える