4

アプリケーションのマルチスレッドソリューションを探していましたが、NullReferenceExceptionそれぞれを連続して実行してすべてがスムーズに進んだ場合とは対照的に、試行するとランダムエラーが発生し続けます。

私がやっていることは、ある場所から別の場所への旅を計算してから、帰りの旅を計算することです。復路の計算は、出発地と目的地を切り替えただけで、同じプロセスを使用するだけです。

これは、EntityFrameworkを使用するASP.netMVC3アプリのマルチスレッドでこれを行うのに適していますか?EFに問題があると思われる記事をいくつか見ましたが、これらはDBContextがページで共有されている場合にのみ問題になるようですが、データベースにアクセスする必要があるすべての領域でUsingステートメントを使用しました。誰かここで何か経験がありますか?

私がこれまでに持っている基本的な関連コードはこれです:

var outboundJourneyTask = Task.Factory.StartNew(() => BuildJourney(true));
var returnJourneyTask = Task.Factory.StartNew(() => BuildJourney(false));
Task.WaitAll(outboundJourneyTask, returnJourneyTask);

私が望んでいたのは、各タスクが新たに開始されることでしたが、null参照の例外のため、2番目のスレッドでは、最初のスレッドで構築された配列を使用しようとしていると思います。特定の要素が見つからない場合は、エラーをスローします。

これはありそうですか?誰かがこれを行うためのより良い方法を知っていますか?

編集:私は別のスレッド方法を試していますが(以下を参照)、配列で実際に奇妙なことが起こっています-異なる方法でループし、エラーをスローします

Thread t1 = new Thread(ThreadMethod1);   
t1.Start();

Thread t2 = new Thread(ThreadMethod2);
t2.Start();

void ThreadMethod1(object state)
{
    BuildJourney(false);
    ManualResetEvent mre = (ManualResetEvent)state;
    mre.Set();
}
void ThreadMethod2(object state)
{
    BuildJourney(true);
    ManualResetEvent mre = (ManualResetEvent)state;
    mre.Set();
}

ありがとう

4

1 に答える 1

4

「この音は実現可能ですか..?」はい、間違いなく。

実装は簡単です.....多分そうではありません。

Thread t1 = new Thread(ThreadMethod1)

は時代遅れですが、.net4+フレームワークでマルチスレッドを実行するために必ずしも非推奨の方法ではありません。あなたが投稿したものから、あなたがタスクを使用できないことを示すものは何もありません。タスクファクトリはTPLでタスクを管理するためのより現代的な方法ですが、個人的にはいくつかの癖があることがわかりました。もし私があなたなら、これをやってみようと思います:

   Task T = new Task(() =>
                {
                   BuildJourney(true);
                });
                Task T2 = T.ContinueWith((antecedent) =>
                {
                     BuildJourney(false);
                });

これにより、T1が戻ったときにのみT2が実行されるようになります。ただし、Ladislavが述べているように、BuildJourneyメソッドはスレッドセーフではない可能性があります。これにより、スレッドの障害がどこにあるかを判断する上で、少なくとも一歩先を行くことができます。適切な非同期およびマルチスレッドのデバッグを調査することをお勧めします。単なるF5よりも少し複雑です。複数サイトやコードプロジェクトなどのサイトには、.netスレッドプログラミングのデバッグと作成に関する非常に優れたチュートリアルがあります。

ここで非常に良いスタートを切ることができます。幸運を!

于 2012-08-23T16:14:47.620 に答える