2013-10-14 4 views
-1

Я использую многопоточность на применении выигрыша сМногопоточность, возвращаемое значение на Control.Invoke()

System.Threading.ThreadPool.QueueUserWorkItem(delegate{}, null); 

Проблема мой метод требует значение возврата на основной поток (объект DialogeResult) и с this.Invoke() Я не могу получить значение из основного потока. Вот код метода:

public static DialogResult Show(IWin32Window owner, PSSettings.Settings settings, string title, string caption, MessageBoxButtons buttons) 
    { 

     return (DialogResult)((Form)owner).Invoke((Action)(() => 
     { 
      PSMessageBox mb = new PSMessageBox(); 
      mb._settings = settings; 

      mb.lblTitle.Text = title; 
      mb.lblCaption.Text = caption; 
      mb.Buttons = buttons; 

      return mb.ShowDialog(); 
      mb.ShowDialog(owner); 
     })); 
    } 

Может кто-нибудь показать мне, как получить возвращаемое значение из метода Invoke с делегатом любого рода?

+1

Обычно 'QueueUserWorkItem' не должен открывать модальную форму. Вы должны использовать ThreadPool для работы с небольшим фоном, и уверены ли вы, что вы можете использовать 'IWin32Window' для' Form'? –

ответ

3

Вы могли бы сделать что-то вроде этого:

public static DialogResult Show(IWin32Window owner, PSSettings.Settings settings, string title, string caption, MessageBoxButtons buttons) 
{ 
    DialogResult result; 

    ((Form)owner).Invoke((Action)(() => 
    { 
     PSMessageBox mb = new PSMessageBox(); 
     mb._settings = settings; 

     mb.lblTitle.Text = title; 
     mb.lblCaption.Text = caption; 
     mb.Buttons = buttons; 

     result = mb.ShowDialog(owner); 
    })); 

    return result; 
} 

Но помните, в то время как ваш диалог является openend, ваш поток блокируется.

0

Action<*> Делегаты ничего не возвращают.
Вам нужны общие делегаты Func<*>.

0
 DialogResult res; 
     ((Form)owner).Invoke((Action)(() => 
     { 
      PSMessageBox mb = new PSMessageBox(); 
      mb._settings = settings; 

      mb.lblTitle.Text = title; 
      mb.lblCaption.Text = caption; 
      mb.Buttons = buttons; 


      res = mb.ShowDialog(owner); 
     })); 
     //user res 
Смежные вопросы