0

完了までに時間がかかるメソッドがいくつかあるアプリがあります。バックグラウンドワーカーを使用してこれらのメソッドを実行し、UI の応答性を維持しています。私の方法は次のようになります

public void DoSomething()
{
   while( HaveMoreWork )
   {
     // do work
   }
}

UIでいつでもこれをキャンセルできるようにしたいので、メソッドを変更してBackgroundworkerを取得しました

public void DoSomething(Backgroundworker worker)
{

   while( HaveMoreWork && !worker.CancelationPending )
   {
     // do work
   }
}

私の質問は、これを行うためのより良い方法があるかどうかです。これらすべてのメソッドに Backgroundwoker を引数として渡すのは少し面倒です。このためのベストプラクティスは何ですか?

4

2 に答える 2

1

グローバル変数を使用しています

private BackgroundWorker _bwSearch = new BackgroundWorker();

private void InitializeBackgroundWorker()
{
     _bwSearch = new BackgroundWorker();
     _bwSearch.WorkerSupportsCancellation = true;
     _bwSearch.DoWork += bwSearch_DoWork;
     _bwSearch.RunWorkerCompleted += bwSearch_RunWorkerCompleted;
}

停止ボタンをクリックすると

 private void btnCancel_Click(object sender, EventArgs e)
 {
      _bwSearch.Abort();
 }

更新: BackgroundWorkerから継承されたこの単純なヘルパークラスも使用しています

public class AbortableBackgroundWorker : BackgroundWorker
    {
        private Thread _workerThread;

        protected override void OnDoWork(DoWorkEventArgs e)
        {
            _workerThread = Thread.CurrentThread;

            try
            {
                base.OnDoWork(e);
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;

                Thread.ResetAbort();
            }
        }

        public void Abort()
        {
            if (_workerThread != null)
            {
                _workerThread.Abort();

                _workerThread = null;
            }
        }
    }
于 2012-07-11T15:48:22.130 に答える
0
public class DoSomethingService
{
    private volatile bool _stopped = false;

    public void Start(object socketQueueObject)
    {
        while (!_stopped)
        {
            ...
        }
    }

    public void Stop()
    {
        _stopped = true;
    }
}

...

var doSomethingService = DoSomethingService();
doSomethingService.Start();
...
doSomethingService.Stop();
于 2012-07-11T15:44:27.497 に答える