プログラムとDDCと呼ばれるマシンとの間の接続を開始するボタンがあります。接続の確立中にUIスレッドがロックされないようにするために、私は当然、ジョブを処理するバックグラウンドワーカーを作成します。
問題は次のとおりです。クライアントがDDCから応答を受け取らない場合、クライアントはタイムアウトを与える前に30秒待機する必要があります。より正確に言えば、スレッドは「GetLogicStatusListResponse result = ddcdao.GetLogicStatusList();」の行で実行を停止します。
プログラムでボタンがクリックされた場合にユーザーが操作をキャンセルできるようにしたいのですが、私が知る限り、バックグラウンドワーカーを中止する方法はなく、スレッドがロックされているため、キャンセルしても実際には役に立ちません。コードがキャンセル保留が真であるかどうかをチェックする前に、30秒間。
ユーザーがいつでも接続を開始/停止できるように、キャンセル機能を適切に実装するためのアイデアをいくつか聞きたいと思います。
private void bwWorkerConnect_DoWork(object sender, DoWorkEventArgs e)
{
//Branch in only if the DDC returns a ping response
if (DDCGlobal.DDCPingTest(ddc))
{
try
{
//Creates an object of class which communicates with the engine
//Retrieves the object obtained through remoting (Engine)
//and casts it to a ReqDDCLogicListResponse type (See CommonEngine)
DDCDAO ddcdao = new DDCDAO(DDCGlobal.ddcEngineIP, ddc.Ip);
//Request status list from DDC (TIMEOUT = 30 SECONDS)
GetLogicStatusListResponse result = ddcdao.GetLogicStatusList();
...
if (bwWorkerConnect.CancellationPending)
{
e.Cancel = true;
}
public void LogicListLoad()
{
if (!bwWorkerConnect.IsBusy)
bwWorkerConnect.RunWorkerAsync();
else
{
MessageBox.Show(UIConstant.DDC_CONNECT_ALREADY_WARNING);
}
}