【发布时间】:2012-12-05 06:14:48
【问题描述】:
我的 DB2/400 有一个简单的心跳方法:
public bool CheckConnection()
{
try
{
using (OleDbConnection db = new OleDbConnection( this.conString ))
{
OleDbCommand cmd = new OleDbCommand();
cmd.CommandText = "select 1 from sysibm.sysdummy1";
cmd.Connection = db;
db.Open();
cmd.ExecuteReader();
db.Close();
return true;
}
}
catch (Exception)
{
return false;
}
}
我想在我的应用程序运行时使用它,当然我不想保留表单其余部分的执行。
我的表单中的主要方法:
public FrmMain()
{
InitializeComponent();
PrepareFormTexts();
PrepareFormData();
PrepareStateClass();
CheckDbConnection();
//Initialize Data Access for AS400
Dal = JDE8Dal.Instance;
Dal.conString = Properties.Settings.Default.conAS400;
//Initialize Icons
picCon.Image = Properties.Resources.ledGreen;
picStatus.Image = Properties.Resources.ledGreen;
// Load recording from file if they exist
PrepareRecordings(AppState.DataFileName,'|');
}
CheckDbConnection 方法:
private async Task<bool> CheckDbConnection()
{
return await Task.Factory .StartNew(() => Dal.CheckConnection());
}
我认为它运行良好,但我收到警告
警告 1 由于不等待此调用,因此在调用完成之前继续执行当前方法。考虑将“等待”运算符应用于调用结果。
我应该忽略它吗?我应该将 async 放在 main 方法中吗?
更新: 在下面讨论后我发现,由于我使用 .NET 4.0 的异步包,我不能真正让我的 dal 方法成为非阻塞的。我唯一能做的就是使用 async/await + task.factory.startnew 以在 dal 在后台工作时让我的应用程序正常工作。
代码如下:
public FrmMain()
{
InitializeComponent();
Load += FormLoadInit;
}
private async void FormLoadInit(object sender, EventArgs e)
{
PrepareFormTexts();
PrepareFormData();
PrepareStateClass();
txtLot.Select();
//Initialize Data Access for AS400
Dal = JDE8Dal.Instance;
Dal.conString = Properties.Settings.Default.conAS400;
// Load recording from file if they exist
PrepareRecordings(AppState.DataFileName, '|');
bool cn = await Task.Factory.StartNew(() => Dal.CheckConnection());
//Initialize Icons
picCon.Image = cn ? Resources.ledGreen : Resources.ledRed;
picStatus.Image = Properties.Resources.ledGreen;
}
【问题讨论】:
-
有没有实际使用
CheckDbConnection的结果的场合? -
你检查过这个link吗?
-
@MarcGravell 抱歉:main 方法还没有准备好..当然我会在那里使用它来设置各种启动参数..放它看看它是否编译
标签: c# .net multithreading