Многопоточное приложение для Windows - PullRequest
2 голосов
/ 30 ноября 2010

Допустим, у меня есть форма с двумя текстовыми полями

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

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

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

есть идеи, как это сделать без подвешивания основного потока?

Пример:

    txtFrom.Invoke(new MethodInvoker(() => strFrom = txtFrom.Text));
        txtTo.Invoke(new MethodInvoker(() => strTo = txtTo.Text));
        txtMessageBody.Invoke(new MethodInvoker(() => strMessageBody = txtMessageBody.Text));
        txtStartDate.Invoke(new MethodInvoker(() => strStartDate = txtStartDate.Text));
        txtEndDate.Invoke(new MethodInvoker(() => strEndDate = txtEndDate.Text));
        ddlStatus.Invoke(new MethodInvoker(() => intStatus = ddlStatus.SelectedIndex));

спасибо заранее

Окружающая среда:

Windows 7. .Net 4 Windows Form C #

Ответы [ 3 ]

3 голосов
/ 30 ноября 2010

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

Причина этого в том, что Invoke заставляет ваш рабочий поток сидеть и ждать, пока поток пользовательского интерфейса не будетимеется в наличии.Это может быть проблемой, потому что есть хороший шанс, что ваш поток пользовательского интерфейса сидел в ожидании, чтобы ваш рабочий поток что-то сделал.(Например, ваш рабочий поток может обладать блокировками, возможно, о которых вы даже ничего не знаете, потому что они находятся внутри какого-то библиотечного компонента. Неявное получение блокировок или других ресурсов, не подлежащих обмену, может вызвать взаимные блокировки даже в одноразовыхкод потока , так что лучше быть осторожным. Почти всегда ужасная идея - заставить рабочий поток ждать, пока поток пользовательского интерфейса что-то сделает.)

Как указывает Питер Лиллевольд, в конечном итоге вам нужно сделатьуверен, что вы ничего не делаете медленно в потоке пользовательского интерфейса.Но из вашего примера кода не ясно, что происходит - я не вижу ничего очевидного в вашем коде, который будет медленным, и из вашего описания это звучало так, как будто приложение зависло полностью, и в этом случае более вероятно, что вы 'у нас есть тупик, вызванный Invoke.

2 голосов
/ 30 ноября 2010

Поскольку они живут в одной форме, они все будут принадлежать одному и тому же потоку графического интерфейса. Это означает, что вы можете использовать любой из них (или их родительскую форму) в качестве цели вызова и выполнять все операции в течение одного вызова:

this.Invoke(new MethodInvoker(() => 
{
    strFrom = txtFrom.Text; 
    strTo = txtTo.Text; 
    strMessageBody = txtMessageBody.Text; 
    strStartDate = txtStartDate.Text; 
    strEndDate = txtEndDate.Text; 
    intStatus = ddlStatus.SelectedIndex;
})); 

Я не уверен, что это решит вашу проблему, но, по крайней мере, это упростит ваш код.

1 голос
/ 30 ноября 2010

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

Когда вы Invoke управляете в WinForms, как вы описываете, код в этих MethodInvokes фактически выполняется в пользовательском интерфейсе / основном потоке. Это сделано специально, при вызове этих элементов управления будет выполняться код в потоке пользовательского интерфейса, чтобы к элементам управления можно было обращаться в том потоке, в котором они были изначально созданы. Таким образом, любая длительная операция в этом коде приведет к зависанию потока пользовательского интерфейса .

Поэтому длительная операция должна быть запущена в отдельном потоке, возможно, с использованием BackgroundWorker .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...