2013-04-24 38 views
0

之間的曖昧我試圖編譯下面的代碼:電話是的ThreadStart和ParameterizedThreadStart

public class SplashScreenManager 
{ 
    private static readonly object mutex = new object(); 
    public static ISplashScreen CreateSplashScreen(Stream imageStream, Size imageSize) 
    { 
     object obj; 
     Monitor.Enter(obj = SplashScreenManager.mutex); 
     ISplashScreen vm2; 
     try 
     { 
      SplashScreenWindowViewModel vm = new SplashScreenWindowViewModel(); 
      AutoResetEvent ev = new AutoResetEvent(false); 
      Thread thread = new Thread(delegate 
      { 
       vm.Dispatcher = Dispatcher.CurrentDispatcher; 
       ev.Set(); 
       Dispatcher.CurrentDispatcher.BeginInvoke(delegate //<- Error 2 here 
       { 
        SplashForm splashForm = new SplashForm(imageStream, imageSize) 
        { 
         DataContext = vm 
        }; 
        splashForm.Show(); 
       }, new object[0]); 
       Dispatcher.Run(); 
      }); 
      thread.SetApartmentState(ApartmentState.STA); 
      thread.IsBackground = true; 
      thread.Start(); 
      ev.WaitOne(); 
      vm2 = vm; 
     } 
     finally 
     { 
      Monitor.Exit(obj); 
     } 
     return vm2; 
    } 
} 

,並得到了錯誤:

The call is ambiguous between the following methods or properties: 'System.Threading.Thread.Thread(System.Threading.ThreadStart)' and 'System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)'

EDIT1: 我糾正代碼,並得到錯誤2 :

無法將匿名方法轉換爲鍵入'System.Windows.Threading。 DispatcherPriority「,因爲它不是委託類型

+0

見我提供用於固定代碼爲.NET 3.5以及4 – chrisw 2013-04-24 09:21:38

回答

2

對於BeginInvoke,有不同的方法調用根據您使用的框架而有所不同。看看http://msdn.microsoft.com/en-us/library/ms604730(v=vs.100).aspxhttp://msdn.microsoft.com/en-us/library/ms604730(v=vs.90).aspx,或者您正在使用的.NET框架的任何版本以獲取更多信息。

試試.NET 3.5和4的兼容性;這應該解決你的第一個和第二個問題;您遇到的第二個錯誤的線索在錯誤消息中;您正在使用的方法是期望不帶對象參數的DispatcherPriority,並且您將委託傳遞給它,實際上它需要作爲第二個參數。

Thread thread = new Thread(new ThreadStart(() => 
     { 
      vm.Dispatcher = Dispatcher.CurrentDispatcher; 
      ev.Set(); 
      Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, new MethodInvoker(() => 
      { 
       SplashForm splashForm = new SplashForm(imageStream, imageSize) 
       { 
        DataContext = vm 
       }; 
       splashForm.Show(); 
      })); 
      Dispatcher.Run(); 
     })); 

MethodInvoker vs Action for Control.BeginInvoke爲什麼MethodInvoker是一種更有效的選擇

7

您可以嘗試用delegate(){...}替換delegate{...}。這樣編譯器會知道你想要一個沒有參數的動作的重載。

+0

是的,這是正確的答案。但是請參閱錯誤2 – Superjet100 2013-04-24 08:27:57

+0

您沒有將任何參數傳遞給委託,因此使用帶有單參數的BeginInvoke - 委託,並刪除',new object [0]' – alex 2013-04-24 08:34:04

+0

您能用代碼解釋嗎?謝謝。 – Superjet100 2013-04-24 08:37:48