Задача асинхронных данных на проблему формы showdialog - PullRequest
0 голосов
/ 11 октября 2019

Я хочу создать простое асинхронное приложение для всплывающих окон, и в конце окно формы будет показывать диалог. Но когда я запускаю программу, программа автоматически завершает работу без ошибок. Можете ли вы помочь мне решить, вот мой код

    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

Можете ли выесть хороший совет

1 Ответ

1 голос
/ 11 октября 2019

Вам нужно дождаться звонка на 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));
...