0

動作しているアプリケーションがあり、反復回数が可変のループがあります。このループには関数呼び出しが 1 つあります。次に、関数を別のスレッドとして起動するようにプログラムを変更しようとしました。実行する単体テストをセットアップしましたが、作業が完了する前にアプリケーションの実行が停止しました。

1 つのスレッドで 1 つの反復とデバッグを行うようにループを設定しました。常に同じ行ではなく、各スレッドで選択を変更できるデータテーブルとデータ行を持つオブジェクトのコピーを作成しようとする同じ領域で、関数の上部近くで実行が停止します。以下はコードで、この領域でデバッグすると一貫して停止しますが、到達する行は異なります。

// main thread called by unit test
...
for(...
{
   Task compute = Task.Factory.StartNew(() => results.Add(Compute(originalObject)));
}
...
private ReturnObject Compute(MyObject originalObject)
{
   ...
   // near top of function after some assignment statements
   // of some string and boolean variables
   MyObject myObject = originalObject.Copy;
   // never makes it to the next line
   ...
}

// MyObject class

private MyObject(DataTable dtTable)
{
   _dataService = new DataService();
   _dataTable = dtTable.Copy();
   _dataRows = _dataTable.Select();
}

public MyObject Copy()
{
   MyObject copy = new MyObject(_dtTable);
   return copy;
}

// DataService class

public DataService()
{
   _oleDbConnection = null;
}
4

1 に答える 1

2

Wait作成したタスクが完了するようには見えません。Waitメソッドを呼び出すか、一般的なタスクのプロパティにアクセスしてResult、作業が完了するまで呼び出し元のスレッドをブロックする必要があります。次のことを試してください。

var tasks = new List<Task>();
for ...
{
   Task compute = Task.Factory.StartNew(() => results.Add(Compute(originalObject)));
   tasks.Add(compute);
}

Task.WaitAll(tasks.ToArray());
于 2013-07-10T15:06:24.733 に答える