0
//static int var1, var2, var3;
//static List<string> list;

    public static void MyMethod(Object obj, int times)
    {
        List = doc1.Descendants("Order")
            .Select(d => d.Value)
            .ToList();
        for (int i = 0; i < List.Count; i++)
        {
            try
            {
                var item = (from m in doc1.Elements("list").Elements("Order")
                                where m.Value == List[i]
                                select m);

                item.Remove();

                doc1.Save(path1);
                var1 = doc1.Root.Descendants("Order").Count();


                //DoSomethingHeavy with List[i]

                doc2.Element("list2").Add(new XElement("Order", List[i]));
                doc2.Save(path2);


                 var2= doc2.Root.Descendants("Order").Count();

            }
            catch (Exception)
            {
                doc3.Element("list3").Add(new XElement("Order", List[i]));
                doc3.Save(path3);

                var3 = doc3.Root.Descendants("Order").Count();

            }
        }
    }

これは、パブリック静的クラスのMyMethodです。実行を一時停止および再開できるように、BackgroundWorkerの下のフォームで実行したいと思います。

私はこのクラスを使用しています:

public class BackgroundLoading
{
    public BackgroundWorker Bw;
    public delegate void RunFunction();
    public RunFunction thisFunction;



    public BackgroundLoading(RunFunction newFunction)
    {
        thisFunction = newFunction;
        Bw = new BackgroundWorker();
        Bw.DoWork += new DoWorkEventHandler(Bw_DoWork);
        Bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Bw_RunWorkerCompleted);
    }

    public void Start()
    {
        Bw.RunWorkerAsync();
    }

    void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            //an error occured
            MessageBox.Show("an error occured: " + e.Error.Message);
        }
        if (e.Cancelled)
        {
            //an error occured
            MessageBox.Show("Job cancelled");
        }
        else
        {
            MessageBox.Show("Job completed");
        }

    }

    void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        MessageBox.Show(" *");
    }

    void Bw_DoWork(object sender, DoWorkEventArgs e)
    {
        if (thisFunction != null)
            thisFunction();
    }
}

 //class to implement

次に、myFormで:

private void button1_Click(object sender, EventArgs e)
    {
        BackgroundLoading bl = new BackgroundLoading(MyMethod());
        bl.Start();
    }

私はBackgroundWorkerを初めて使用し、おそらく正しい方法で使用していません。StopExecutionボタンをクリックしても、すべてのドキュメント(doc1、doc2、doc3)が保存されているわけではありません。では、どうすればtry-catchブロックで停止しないようにできますか?

4

1 に答える 1

1
  1. BackgroundWorkerがキャンセルをサポートできるようにするには、WorkerSupportsCancellationをTrueに設定します。
  2. キャンセルボタンでCancelAsync()メソッドを呼び出します。
  3. 2つのメソッドに分割して、メソッドを変更します。1つはアイテム番号を取得する必要があり、もう1つはアイテムごとに機能します。
  4. DoWork()メソッドで、保留中のキャンセルがあるかどうかを確認し、ある場合はプロセスを終了します。

      void Bw_DoWork(object sender, DoWorkEventArgs e)
      {
    
        //in your loop test every time Cancel flag       
        for (int i = 0; i < MyMethodGetItemcount(); i++)
        {
            MyMethod(i);//item by item
            if(yourbackgroundworker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
     }
    
于 2012-08-12T11:32:25.053 に答える