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 この呼び出しは待機されていないため、呼び出しが完了する前に現在のメソッドの実行が続行されます。呼び出しの結果に「await」演算子を適用することを検討してください。
私はそれを無視する必要がありますか?メインメソッドに非同期を入れる必要がありますか?
更新:以下で説明した後、.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;
}