-2

Method2 で以下のように 2 つのスレッドを生成する次のコードがあります。

Thread[] arrThreads = new Thread[2];

Thread t1 = new Thread(() =>
{
    value1 = this.Method1(<some params>);
});
t1.Start();
arrThreads[0] = t1;

Thread t2 = new Thread(() =>
{
    value2 = this.SomeOtherMethod(<some params>);
});
t2.Start();
arrThreads[1] = t2;

// Code which waits for both threads to get over OR for a threshold, whichever comes first!

これは私の開発ではうまくいきます。しかし、IIS 運用マシンにリリースすると、次のエラーが発生します。

    at System.Data.RBTree`1.GetNodeByIndex(Int32 userIndex) 
    at System.Data.RBTree`1.get_Item(Int32 index) 
    at System.Data.DataRowCollection.get_Item(Int32 index) 
    at Namespace.Class.Method1(params) in D:\XXXX\Class.cs:line 11309 
    at Namespace.Class.<>c__DisplayClasse.<Method2>b__a() in D:\XXXX\Class.cs:line 11687 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()

誰でもこのエラーで私を助けてくれますか? 前もって感謝します。

4

1 に答える 1

0

Namespace.Class.Method1、 in 、 on-or-aboutで何が起こっているかを確認する必要がありますD:\XXXX\Class.cs:line(行番号の追跡が少しおかしくなることがあります) 11309。

var row = someDataTable.Rows[0];

この時点では、行はありません。何らかの理由でクエリがデータを返さなかった可能性があります (クエリを確認してください)。理論的には、これが非同期スレッドの問題 (2 つのスレッドを開始するため) または競合状態に関連している可能性もありますが、繰り返しになりますが、そのための十分なコンテキストがありません。それまでは、これがマルチスレッドに関連していると仮定する理由はありませんが、同じ状態データを変更する複数のスレッドがある場合の可能性として留意する必要があります。

于 2013-09-04T08:57:58.497 に答える