显示对话框表单问题上的任务异步数据表
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));
我想创建简单的异步弹出 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));