0

プログラムと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);
        }

    }
4

1 に答える 1

3

今後の参考のために、私のコメントを回答として投稿してください。

BackgroundWorker最初のワーカーと一緒に 2 つ目のワーカーを実行して問題に取り組むことができます。これは、最初のワーカーのフラグをポーリングしてステータスを確認するだけです。独立しているため、「待機」する必要はなく、最初のワーカーを自由に強制終了できます。行き詰まります。

フラグ処理命令lock.

フローは次のようになります。

  • 接続が必要な場合は、両方のワーカーを起動します
  • 最初のワーカーは接続を試行し、「接続中」ステータスを外部世界に通知するフラグを設定します
  • 2 番目のワーカーは、最初のワーカーのステータスを 1 秒ごとに 30 回チェックする可能性があります。「接続中」と異なるものを読み取らない場合は、続行して最初のワーカーを強制終了できます。また、ユーザー入力に反応して、時間前に最初のワーカーを強制終了することもあります (つまり、任意のユーザー入力が2 番目のワーカーをキャンセルし、それ自体が終了する前に最初のワーカーを強制終了することができます)。
  • フローエンド
于 2012-07-17T08:23:55.810 に答える