【问题标题】:is it possible to return a value with synchronizationcontext .send是否可以使用同步上下文返回一个值 .send
【发布时间】:2012-11-06 23:07:34
【问题描述】:

我们需要使用 SynchronizationContext 通过 Send 返回一个值(特别是 MessageBox DialogResult)(我们不希望通过“Post”进行异步)。只是不确定语法。 我们遇到了 MessageBox 出现在主窗口后面的问题,这被认为是由于无法轻松访问主窗体 IWin32Window 值引起的……我们正在使用它,但老实说我对此感到不舒服。

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

【问题讨论】:

    标签: c# messagebox multithreading synchronizationcontext


    【解决方案1】:

    您可以将 object 传递给您传递给 Send 的委托。

    这就是我要做的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 2022-12-03
      • 1970-01-01
      • 2011-08-24
      相关资源
      最近更新 更多