显示对话框表单问题上的任务异步数据表

task async datatable on showdialog form problem

我想创建简单的异步弹出 windows 应用程序,windows 表单最后是 showdialog。 但是当我 运行 程序时,程序自动退出没有错误 你能帮我解决吗,这是我的代码

    private static string pridbUser = "user";
    private static string pridbPwd = "abc123";
    public void run()
    {
        string cnnStr = @"Data Source=localhost;Initial Catalog=sampledb;User ID=" + pridbUser + ";Password=" + pridbPwd + ";MultipleActiveResultSets=true";
        string sql = "SELECT * FROM [TABLE1]";
        using (SqlConnection sqlcnn = new SqlConnection(cnnStr))
        {
            sqlcnn.Open();
            var tskJob = CreateTableAsync(sql, sqlcnn);                
            using (frmUI ui = new frmUI())
            {
                Task.WhenAll(tskJob);
                ui.BindControl(tskJob.Result.DefaultView);
                ui.ShowDialog();
            }

        }        
    }
    private async Task<DataTable> CreateTableAsync(string sql, SqlConnection dbCnn)
    {

        using (SqlCommand _c = new SqlCommand(sql, dbCnn))
        {
            DataTable dt = new DataTable();
            dt.Load(await _c.ExecuteReaderAsync());
            return dt;
        }

    }

修改,嗨,谢谢你的评论,然后我重写了异步作业,但结果不是我想要的,代码如下:

private static string pridbUser = "user";
private static string pridbPwd = "abc123";
public void run()
{
    string cnnStr = @"Data Source=localhost;Initial Catalog=sampledb;User ID=" + pridbUser + ";Password=" + pridbPwd + ";MultipleActiveResultSets=true";
    string sql = "SELECT * FROM [TABLE1]";
    using (SqlConnection sqlcnn = new SqlConnection(cnnStr))
    {
        sqlcnn.Open();
        Console.WriteLine("Create Table with Asyn mode");
        var tskJob = CreateTableAsync(sql, sqlcnn);                
        using (frmUI ui = new frmUI())
        {
            Console.WriteLine("Create Form Complete");
            Task.WhenAll(tskJob);
            ui.BindControl(tskJob.Result.DefaultView);
            ui.ShowDialog();
        }

    }        
}
private async Task<DataTable> CreateTableAsync(string sql, SqlConnection dbCnn)
{
    Console.WriteLine("Start to Create Table")
    using (SqlCommand _c = new SqlCommand(sql, dbCnn))
    {
        DataTable dt = new DataTable();
        dt.Load(await _c.ExecuteReaderAsync());
        Console.WriteLine("Delay 5 second")
        Thread.Sleep(5000); // delay 5 seconds
        Console.WriteLine("End Delay")
        return dt;
    }

}

运行宁结果是:

Create Table with Asyn mode
Start to Create Table
Delay 5 second
End Delay and Return
Create the Form Complete
Bind Control

但我的预期结果应该是

Create Table with Asyn mode
Start to Create Table
Create the Form Complete
Delay 5 second <-- as it should not wait 5 second and then run form in async process
End Delay and Return
Bind Control

有什么好的建议吗

您需要等待对 Task.WhenAll() 的调用(或调用 Wait(),如果不能,如 Task.WhenAll Method doco 的示例部分所示。

同样在您的 CreateTableAsync 中,您应该等待 Task.Delay 电话。

这里有一些建议:

var tskJob = CreateTableAsync(sql, sqlcnn);   
tskJob.Wait() // Normally, you should use await if possible             
            using (frmUI ui = new frmUI())
            {
                // not needed Task.WhenAll(tskJob);
                ui.BindControl(

(...)

// Change Thread.Sleep(5000); // delay 5 seconds
//to
await Task.Delay(TimeSpan.FromSeconds(5));