我在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>
答案 0 :(得分:-2)
默认情况下,Visual Studio(2017)中的新项目只能与该语言的最新主要版本(即7.0)一起使用,但是您可以更改它。请关注Ben Willi
的博客