2013-04-24 2 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

ответ

2

Существует множество различных вызовов метода для BeginInvoke, которые различаются в зависимости от используемой структуры. Взгляните на http://msdn.microsoft.com/en-us/library/ms604730(v=vs.100).aspx и http://msdn.microsoft.com/en-us/library/ms604730(v=vs.90).aspx или на любую другую версию .NET framework, которую вы используете для получения дополнительной информации.

Попробуйте это для совместимости .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

+0

Вы не передаете какие-либо параметры делегату, поэтому используйте BeginInvoke с единственным параметром - делегировать и удалите ', новый объект [0]' – alex

+0

Можете ли вы объяснить это кодом? Благодарю. – Superjet100

Смежные вопросы