0

我试图编译以下代码:

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”,因为它不是委托类型

4

2 回答 2

9

您可以尝试替换delegate{...}delegate(){...}. 这样编译器就会知道你想要一个没有参数的重载动作。

于 2013-04-24T08:12:41.250 回答
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 是更有效的选择

于 2013-04-24T08:15:31.647 回答