从C#Thread回调中检索值时出错

时间:2013-09-04 08:39:51

标签: c# multithreading

我有以下代码来生成两个线程,如下面的Method2

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()

有人可以帮我解决这个错误吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您需要检查Namespace.Class.Method1中的D:\XXXX\Class.cs:line内所发生的事情,在{或1-}左右(有时线号跟踪有点棘手)11309.我希望它会做某事像:

var row = someDataTable.Rows[0];

此时,没有行 - 也许某个查询由于某种原因没有返回任何数据(请检查查询)。理论上,这也可能与非同步线程问题(因为你启动两个线程)或竞争条件有关 - 但同样:我们没有足够的上下文。在此之前,没有理由预先假定这与多线程有关,但如果你有多个线程改变相同的状态数据,那么就应该记住这一点。