public async Task InvokeAsync(DispatcherPriority priority, Delegate callback, params object[] arguments) { if (ContextThread == Thread.CurrentThread) { callback.DynamicInvoke(arguments); return; } switch (ContextType) { case GuiContextType.None: { await Task.Run(() => { callback.DynamicInvoke(arguments); }); return; } case GuiContextType.WPF: { await GuiDispatcher.InvokeAsync(() => { callback.DynamicInvoke(arguments); }, priority); return; } case GuiContextType.WinForms: { var doneEvent = WaitEventFactory.Create(isCompleted: false, useSlim: true); Context.Post((args) => { try { callback.DynamicInvoke(args as object[]); } catch { throw; } finally { doneEvent.Complete(); } }, arguments); await Task.Run(() => { doneEvent.Wait(); doneEvent.Dispose(); }); return; } } }
/// <summary> /// Processing the application start. /// </summary> /// <param name="e">Argument.</param> protected override void OnStartup(StartupEventArgs e) { GuiDispatcher.InitGlobalDispatcher(); DispatcherPropertyChangedEventManager.Init(); //GuiDispatcher.GlobalDispatcher.AddPeriodicalAction(CommandManager.InvalidateRequerySuggested); if (!ProxyConfigurationFile.IsEmpty() && File.Exists(ProxyConfigurationFile)) { var settings = new XmlSerializer <SettingsStorage>().Deserialize(ProxyConfigurationFile); ProxySettings = new ProxySettings(); ProxySettings.Load(settings); ProxySettings.ApplyProxySettings(); } else { ProxySettings = ProxySettings.GetProxySettings(); } if (CheckTargetPlatform) { //если одним из аргументов является путь к самому приложению, //то значит оно запущено из под специального загрузчика var executablePath = Assembly.GetEntryAssembly().Location; if (e.Args.Any(a => a == executablePath) || !Environment.Is64BitOperatingSystem) { var language = e.Args.FirstOrDefault(s => s.ContainsIgnoreCase(_langPrefix)); LocalizedStrings.ActiveLanguage = language != null ? language.Replace(_langPrefix, string.Empty).To <Languages>() : LocalizedStrings.ActiveLanguage; StartApp(); return; } if (!Directory.Exists(AppDataPath)) { Directory.CreateDirectory(AppDataPath); } var window = new TargetPlatformWindow(); if (window.AutoStart || window.ShowDialog() == true) { switch (window.SelectedPlatform) { case Platforms.x86: StartX86(); Process.GetCurrentProcess().Kill(); break; case Platforms.x64: // обнуляем ссылку главного окна, так как она равна TargetPlatformWindow MainWindow = null; StartApp(); break; } } else { MainWindow = null; Close(); } } base.OnStartup(e); }
protected override void Awake() { base.Awake(); Dispatcher = FindObjectOfType <GuiDispatcher>(); }