1

运行此程序时,有时异常有一个堆栈跟踪,它起源于以“throw new Exception...”开头的行,但有时它有一个堆栈跟踪,起源于 Parallel.For 委托的第一个大括号。为什么会有那个行号?

using System.Collections.Concurrent;
using System.Threading.Tasks;
using System;
public class J
{
    public static void Main()
    {
        ConcurrentDictionary<string, int> exceptions = new ConcurrentDictionary<string, int>();

        Parallel.For(0, 10, (i, s) =>
        { //this is line 55
            try
            {
                throw new Exception("blah"); //line 58
            }
            catch (Exception e)
            {
                string estring = e.ToString();
                exceptions.TryAdd(estring, 0);
                lock (exceptions)
                {
                    exceptions[estring] += 1;
                }
            }
        });

        foreach (var entry in exceptions)
        {
            Console.WriteLine("==============" + entry.Value + " times");
            Console.WriteLine(entry.Key);
        }
    }
}

这是奇怪的输出

==============3 times
System.Exception: blah
   at J.<>c__DisplayClass5.<Main>b__4(Int32 i, ParallelLoopState s) in Program.cs:line 55
==============7 times
System.Exception: blah
   at J.<>c__DisplayClass5.<Main>b__4(Int32 i, ParallelLoopState s) in Program.cs:line 58
Press any key to continue . . .

我修改了代码以在 e.ToString() 之前包含 System.Threading.Thread.CurrentThread.ManagedThreadId。我必须运行它大约 20 次才能重现它,在第 55 行生成异常。从下面的输出中,我可以看到 Goz 是对的;它在一些并行任务中使用了主线程(线程 ID 1),但是它从主线程获得了两次正确的行号,然后从主线程获得了一次错误的行号。所以还是很神秘。

==============3 times
5 - System.Exception: blah
   at J.<>c__DisplayClass5.<Main>b__4(Int32 i, ParallelLoopState s) in Program.cs:line 58
==============1 times
6 - System.Exception: blah
   at J.<>c__DisplayClass5.<Main>b__4(Int32 i, ParallelLoopState s) in Program.cs:line 58
==============2 times
1 - System.Exception: blah
   at J.<>c__DisplayClass5.<Main>b__4(Int32 i, ParallelLoopState s) in Program.cs:line 58
==============1 times
1 - System.Exception: blah
   at J.<>c__DisplayClass5.<Main>b__4(Int32 i, ParallelLoopState s) in Program.cs:line 55
==============2 times
4 - System.Exception: blah
   at J.<>c__DisplayClass5.<Main>b__4(Int32 i, ParallelLoopState s) in Program.cs:line 58
==============1 times
3 - System.Exception: blah
   at J.<>c__DisplayClass5.<Main>b__4(Int32 i, ParallelLoopState s) in Program.cs:line 58
Press any key to continue . . .

4

2 回答 2

2

Parallel.For 是一个奇怪的调试对象。您看到的行号是指 lambda 块本身(即它发生在此处的某处)。

我曾经设法解决的最好的问题是行号取决于哪个线程抛出异常。从主线程抛出异常似乎是正确的......

会喜欢一个比这更好的答案:)

于 2012-08-14T20:49:45.230 回答
0

.pdb如果文件与 .dll 不同步,则可以关闭断点。尝试清洁并重建。如果这不起作用,请手动删除 Windows 资源管理器中的文件并重新构建。

于 2012-08-14T20:50:01.833 回答