【问题标题】:task async datatable on showdialog form problemshowdialog表单问题上的任务异步数据表
【发布时间】:2019-10-11 00:38:04
【问题描述】:

我想创建一个简单的异步弹出窗口应用程序,窗口窗体最后是 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

你有什么好的建议

【问题讨论】:

  • 我认为您在没有await 的情况下调用该函数,是吗?您可以在其中包含调用它的代码吗?
  • async void run() 是一个火和忘记。它将在主线程的单独线程上执行,而不是等待。
  • @Nkosi 我没有注意到它是void,然后解释它。
  • 嗨,调用这个类只是 static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); SampleApps2.SerClass1 cls = new SampleApps2.SerClass1(); cls.run();返回; }

标签: c# async-await desktop-application


【解决方案1】:

您需要等待对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));

【讨论】:

  • 谢谢,我把代码“Thread.Sleep(5000);”改成 await Task.Delay(5000);但我有一个问题,我尝试删除语句 Task.WhenAll(tskJob);也是工作。所以从我之前的代码中,我不需要添加 Task.WhenAll(tskJob); ?需要什么条件?谢谢
  • 如果你是tskJob.Wait(),那么就不需要WhenAll,因为你已经在等待任务了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多