【发布时间】:2016-02-07 03:01:38
【问题描述】:
下面总是挂在最后:
namespace WhyDoesThisAlwaysHappen {
static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main( ) {
Application.EnableVisualStyles( );
Application.SetCompatibleTextRenderingDefault( false );
new Form1( );
DGApp.Start( ).DontBlock( ).GetAwaiter( ).Result( );
}
}
static class Extensions {
public static async Task DontBlock( this Task T ) {
await T.ConfigureAwait( false );
}
public static async Task<T> DontBlock<T>( this Task<T> T2 ) {
return await T2.ConfigureAwait( false );
}
}
static class DGApp {
public static async Task Start( ) {
await RegistrationTables.Instance.Initialize( ).DontBlock( );
}
}
class RegistrationTables {
private static RegistrationTables _Instance = null;
public static RegistrationTables Instance { get { return RegistrationTables._Instance ?? ( RegistrationTables._Instance = new RegistrationTables( ) ); } }
private SQL SQLTool;
public async Task Initialize( ) {
await ( this.SQLTool = new SQL( new CancellationTokenSource( ).Token ) ).ReadConnectionFile( "Foo" ).DontBlock( );
}
}
class SQL {
private CancellationToken _CT;
public SQL( CancellationToken CT ) {
this._CT = CT;
}
public async Task ReadConnectionFile( string Foo ) {
string[ ] ConnectionDetails = await FTP.ReadFile( Foo, this._CT ).DontBlock( );
}
}
static class FTP {
public static async Task<string[ ]> ReadFile( string Foo, CancellationToken CT ) {
await Task.Delay( 1000 ).DontBlock( );
return new string[ ] { };
}
}
}
Form1( ) 只不过是您在新建 WinForms 项目时创建的默认空白表单。
我发现,如果我要注释掉 new Form1( ) 行,它运行得非常好,但是当我将行留在原处时,它会挂在最后的 await Task.Delay( ... );
为什么这种情况不断发生?从Program.Main( ) 调用异步方法的正确方法是什么?有没有可能?
编辑 1
请注意,无论DontBlock( ) 扩展是否存在(或不存在),这种情况都会持续发生。
【问题讨论】:
标签: c# winforms asynchronous