2012-11-06 44 views
2

我们需要使用SynchronizationContext通过发送(我们不希望通过'Post'异步)返回一个值(特别是MessageBox DialogResult)。只是不确定的语法。 我们在主窗口后面出现MessageBox问题,这被认为是由于无法轻易访问主窗体IWin32Window值而导致的......我们正在使用这个,但说实话,我对它感到不舒服。是否可以使用synchronizationcontext返回一个值.send

DialogResult dr; 
SynchronizationContext synchContext; 

//in main forms constructor 
    { 
     ... 
     synchContext = AsyncOperationManager.SynchronizationContext; 
    } 

void workerThread(object obj, DoWorkEventArgs args) 
{ 

    // SynchronizationContext passed into worker thread via args 
    sc.Send(delegate {dr = MessageBoxEx.Show("Yes or no?", "Continue?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);},null); 
} 

回答

0

您可以将object传递给您传递给发送的代理。

因此,这里是我会做什么:

class DialogResultReference 
{ 
    internal DialogResult DialogResult { get; set; } 
} 
class YourClass 
{ 
    static void ShowMessageBox(object dialogResultReference) 
    { 
     var drr = (DialogResultReference)dialogResultReference; 
     drr.DialogResult = MessageBoxEx.Show("Yes or no?", "Continue?", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); 
    } 

    // ... You just remove dr from the class 
    SynchronizationContext synchContext; 

    //in main forms constructor 
    { 
     ... 
     synchContext = AsyncOperationManager.SynchronizationContext; 
    } 

    void workerThread(object obj, DoWorkEventArgs args) 
    { 
     var drr = new DialogResultReference(); 
     sc.Send(YourClass.ShowMessageBox, drr); 
    } 
} 
相关问题