这个调用在ThreadStart和ParameterizedThreadStart之间是不明确的
本文关键字:之间 不明确 ParameterizedThreadStart 调用 ThreadStart | 更新日期: 2023-09-27 18:10:33
我尝试编译以下代码:
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;
}
}
并得到错误:
调用在以下方法或属性之间是二义性的:"System.Threading.Thread.Thread (System.Threading.ThreadStart)的和"System.Threading.Thread.Thread (System.Threading.ParameterizedThreadStart) '
Edit1: 我更正了代码,得到错误2:
无法将匿名方法转换为"System.Windows.Threading"类型。DispatcherPriority',因为它不是委托类型
您可以尝试将delegate{...}
替换为delegate(){...}
。这样编译器就会知道你想重载一个没有参数的动作。
有相当多不同的方法调用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框架以获取更多信息。
为.NET 3.5和.NET 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。为什么MethodInvoker是一个更有效的选择