Как я могу ждать, пока поток завершит свою работу, а затем выполнить следующую команду C #? - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть код ниже (но не работает) .. Мне нужно подождать, пока поток завершит свою работу, затем выполнить затем следующую команду

private void btnPaste_Click(object sender, EventArgs e)
    {
        if (copiedItems != null)
        {
            if (copy)
            {
                System.Threading.Thread thPASTE = new System.Threading.Thread(PasteFromCopy);
                thPASTE.Start(currAddress);
                lock (this)
                {
                    btnRefresh_Click(sender, e);
                }
            }
            else
            {
                System.Threading.Thread thPASTE = new System.Threading.Thread(PasteFromMove);
                thPASTE.Start(currAddress);
                lock (this)
                {
                    btnRefresh_Click(sender, e);
                }
            }
        }
    }

вставка должна сделать некоторый код, после чего я должен обновить список, который я показываю .. мне нужно сделать это таким образом, потому что он не работает для меня, когда я вызываю обновление в потоке
как мне это сделать ??

Ответы [ 3 ]

5 голосов
/ 08 февраля 2012

Вы можете использовать метод Join в экземпляре потока, который будет блокировать вызывающий поток, пока другой поток не завершит работу.

1 голос
/ 08 февраля 2012

i need to do it this way, because it doesn't work for me when i call the refresh in the thread

Ваша проблема не связана с синхронизацией потоков, такой как Join, Wait, WaitOne и т. Д.

Обновление элементов пользовательского интерфейса из вторичного потока в Windows Forms довольно сложно, поскольку вторичному потоку не разрешено читать или записывать значения свойств непосредственно из формы или любого из ее дочерних элементов управления. Это ограничение существует, поскольку объекты форм и объекты управления в Windows Forms не являются поточно-ориентированными. Единственный поток, которому разрешен прямой доступ к значению свойства формы или одного из ее элементов управления, - это основной поток пользовательского интерфейса

Чтобы обновить ваш графический интерфейс из потока (другого основного потока), вам нужно вызвать Invoke или BeginInvoke методы вашей формы (или некоторые элементы управления), чтобы вставить делегатов в Dispatcher потока пользовательского интерфейса.

Эти ссылки могут вам помочь.

Как обновить графический интерфейс из другого потока в C #?

Обновление пользовательского интерфейса из вторичного потока

Обновление графического интерфейса из другого потока стало проще

1 голос
/ 08 февраля 2012

Вы также можете использовать WaitHandles и использовать методы WaitOne или WaitAll .

...