2011-05-26 42 views
2

我处于较高水平的情况显示一个对话框如下:从多个线程

应用负载和永不会改变开始,为了这个,我的数据做缓存5个线程做一个呼叫的批一个WCF服务。

如果服务关闭,我会弹出一个通知用户出现通信错误的提示,询问他是否要重试或取消操作(该逻辑发生在进行服务调用的线程内部,不关心/知道任何其他正在运行的线程)。

由于我一次接听5个电话,服务中断,我会连续询问5次是否要重试操作或取消操作。

我想要做的是:因为我显示相同的问题只要求用户一次,并返回相同的结果,所有等待的线程。任何想法如何实现这一目标?这听起来不是个好主意,所以我也乐于听到其他方式来实现相同的行为。

public string Show(string key, Action<DialogBuilder> action) 
{ 
    lock (this) //now 4 threads are waiting here 
    {  
     //marshal the dialog to the UI thread 
     return _dispatcher.Send(() => new MyDialogForm().ShowDialog()); 
    } 
} 

谢谢!

回答

1

只是缓存对话的结果,并提供给所有其他对话框像这样(下面的代码可能需要一些调整,因为我在记事本写的):

private DialogResult threadedDialogResult; 
private bool dialogShown; 

public string Show(string key, Action<DialogBuilder> action) 
{ 
    lock (this) //now 4 threads are waiting here 
    { 
     if (!dialogShown) 
     { 
      //marshal the dialog to the UI thread 
      return _dispatcher.Send(() => { dialogShown = true; this.threadedDialogResult = new MyDialogForm().ShowDialog(); }); 
     } 
     else 
     { 
      // Use the cached dialog result as we know it was shown 
      return threadedDialogResult.ToString(); 
     } 
    } 
} 
+0

嗨泰奥曼,会在哪里重新设置的最佳方式dialogShown标志? – 2011-05-26 09:40:39

+0

它不是线程安全的,最好将它重置在锁(this){}块中的任何位置。 – 2011-05-26 09:44:54

+0

但是对于下一个传入线程,它不会总是'假'? – 2011-05-26 09:47:04

0

在这种情况下,您必须使用带锁的静态类/方法。但是附加的逻辑处理用户应答并在解锁后将其返回给其他线程,而不再显示弹出窗口。