如何在async-Main的入口线程上恢复?

时间:2018-06-18 00:57:40

标签: c# asynchronous

我在WPF应用程序中使用带有async Task Main()入口点的C#7.3。我正在实现自己的Main方法,因此在进入WPF生成的async方法之前,我可以安全地运行一些Application.Main方法(因为在{{中使用async代码1}}对我的情况不起作用。)

问题是WPF需要主入口线程(我注意到一个STA线程)作为调用OnStartup的线程(通过Application.Run)。但我不知道如何在入口线程上恢复Application.Main。我假设因为我没有指定await它将被强制在同一个线程上恢复,但现在我知道这只是在建立非默认.ConfigureAwait(false)的情况下,就像在WPF中一样和WinForms,我的代码中尚不存在(SynchronizationContext返回System.Threading.SynchronizationContext.Current)。

这是我的代码:

null

MyApplication.xaml.cs / MyApplication.g.i.cs(生成WPF):

public static class Program
{
    [STAThread]
    public static async Task Main(String[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

        await XmlDocumentConfigurationService.Instance.LoadConfigAsync();

        RegisterDependencies( SimpleIoc.Default );

        MyApplication.Main(); // fails because now the thread is not the entry thread
    }
}

我知道我可以使用Stephen Cleary的/// <summary> /// Application Entry Point. /// </summary> [System.STAThreadAttribute()] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] public static void Main() { MyApplication app = new MyApplication(); app.InitializeComponent(); app.Run(); } 库的AsyncEx类来同步运行我的异步代码,但是这使得使用AsyncContext失败了 - 并添加了另一组依赖项: / p>

async Main

更新:尝试使用[STAThread] public static void Main() { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; AsyncContext.Run( XmlDocumentConfigurationService.Instance.LoadConfigAsync ); RegisterDependencies( SimpleIoc.Default ); MyApplication.Main(); }

由于这是一个WPF应用程序,我以为我会尝试使用DispatcherSynchronizationContext

System.Windows.Threading.DispatcherSynchronizationContext

...不幸的是,执行进入Dispatcher dispatcher = Dispatcher.CurrentDispatcher; DispatcherSynchronizationContext context = new DispatcherSynchronizationContext( dispatcher ); SynchronizationContext.SetSynchronizationContext( context ); await XmlDocumentConfigurationService.Instance.LoadConfigAsync(); // (execution never gets here) RegisterDependencies( SimpleIoc.Default ); MyApplication.Main(); 语句,但之后再也没有继续。我假设这是因为我没有将Dispatcher连接到Win32消息循环 - 我不确定自己是否愿意这样做,因为WPF会在await内自行完成。< / p>

1 个答案:

答案 0 :(得分:-2)

默认情况下,Visual Studio(2017)中的新项目只能与该语言的最新主要版本(即7.0)一起使用,但是您可以更改它。请关注Ben Willi

的博客