【发布时间】:2019-03-22 08:49:23
【问题描述】:
我有这段代码可以从数据库中获取数据
public async Task<DataTable> SelectData(string stored_procedure, SqlParameter[] param)
{
SqlCommand sqlcmd = new SqlCommand();
sqlcmd.CommandType = CommandType.StoredProcedure;
sqlcmd.CommandText = stored_procedure;
sqlcmd.Connection = sqlconnection;
if (param != null)
{
sqlcmd.Parameters.AddRange(param);
}
SqlDataAdapter da = new SqlDataAdapter(sqlcmd);
DataTable dt = new DataTable();
await Task.Run(()=> da.Fill(dt));
return dt;
}
我使用这段代码来运行存储过程
public async Task<DataTable> GetOrderManagementManagerEmail()
{
DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
DataTable dt = new DataTable();
dt =await DAL.SelectData("GetOrderManagementManagerEmail", null);
DAL.Close();
return dt;
}
然后我通过单击按钮使用此代码
private async void btnValidate_Click(object sender, EventArgs e)
{
int[] selectedRows = gridView2.GetSelectedRows();
for (int i = 0; i < selectedRows.Length; i++)
{
DataRow rowGridView2 = (gridView2.GetRow(selectedRows[i]) as DataRowView).Row;
await stock.ValidateProjectNeed(Convert.ToInt32(rowGridView2["id"]), DateTime.Now);
}
if (XtraMessageBox.Show(Resources.addedSuccessfullyBonBesoinAndSendEmail, Resources.Validate, MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
{
Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.MailItem oMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
Recipients oRecips = oMsg.Recipients;
oMsg.To =await Task.Run(()=> stock.GetOrderManagementManagerEmail().Rows[0][0].ToString());
oMsg.Subject = "Bon Besoin " ;
oMsg.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML;
oMsg.Display(false); //In order to display it in modal inspector change the argument to true
oMsg.HTMLBody = "Un nouveau bon besoin a été ajouté " +
"<br />" + oMsg.HTMLBody; //Here comes your body;
}
gridControl2.DataSource = stock.GetProjectNeedsForValidate();
}
但我在这行代码中遇到错误
oMsg.To =await Task.Run(()=> stock.GetOrderManagementManagerEmail().Rows[0][0].ToString());
Task 不包含“Rows”的定义,并且找不到接受“Task”类型的第一个参数的可访问扩展方法“Rows”(您是否缺少 using 指令或程序集引用?)。 在我使用异步之前,代码工作正常。提前致谢。
【问题讨论】:
-
stock.GetOrderManagementManagerEmail()可能是一个异步方法,它返回Task<DataTable>这不是一个 DataTable,您需要异步匿名方法,像这样:async () => ...或使用这样的结果stock.GetOrderManagementManagerEmail().Result.Rows...请记住,使用 Result 属性是一个阻塞调用 -
为什么不你使用
await?无论如何,GetOrderManagementManagerEmail()返回一个任务。 DataTable 存储在任务的Result属性中。Task.Result是一个阻塞调用。请改用简单的var table = await stock.GetOrderManagementManagerEmail() -
我强烈建议重新访问此处的数据访问。您将看似共享的连接对象和现有的数据访问方法结合在一起,而该连接直到被其他任务使用。共享连接字符串,而不是连接对象,如果可能,使用内置的
XxxAsync方法而不是使用Task.Run。Task.Run有一个地方。不是这个。 -
@MindSwipe “stock.GetOrderManagementManagerEmail() 可能是一个异步方法”实际上就是这样。它发布在问题中