2014-11-25 20 views
2

如果我有一个给定的方法,例如:如何调试Task.Factory

protected Task CreateItemsAsync(object source) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     /////// 
     code 
     /////// 
    } 
} 

我有方法一串代码,但我不能踏进方法。有没有办法在代码中循序渐进?

+2

你是什么意思“它只是标记”?如果你的意思是当你在调试器中单步执行时,那是因为这个语句只是开始*任务。你应该能够在* lambda表达式的行*上添加一个断点。 – 2014-11-25 11:30:03

+1

它标志着代码的整个区域,但不会停留在我进入该方法时所使用的断点上。 – MartinZPetrov 2014-11-25 11:32:45

+0

你还没有解释你的意思是“它标志”。你不应该期待它在步入时停止,因为'StartNew' *只是*在后台启动任务。当您继续运行该程序时,调试器将停止在断点上。 – 2014-11-25 11:33:49

回答

0

尝试在一个控制台应用程序的代码:

using System; 
using System.Threading.Tasks; 

namespace Demo 
{ 
    public static class Program 
    { 
     [STAThread] 
     private static void Main() 
     { 
      var task = test(); 
      Console.WriteLine(task.Result); 
     } 

     private static Task<int> test() 
     { 
      return Task<int>.Factory.StartNew(() => 
      { 
       int x = 10; // <-- Set a breakpoint here. 
       int y = 5; 
       int z = x/y; 

       return z; 
      }); 
     } 
    } 
} 

在指定的行设置一个断点,然后调试程序。

调试器将停止在指定的行,您将能够单步执行线程中的其余行。

+0

不适用于函数调用,例如:Task.Factory.StartNew(()=> {CppModuleRunner.InstantiateAndRunCppClass((CppIPModule)module,tokenSource.Token);}); – empty 2016-08-24 16:46:53

+0

@empty它确实有效 - 我只是试了一下。我在lamda中放了一行“Console.WriteLine(”TEST“);'在那一行设置了一个断点,并且调试器停在它上面。你使用的是什么版本的Visual Studio? (如果这不起作用,人们会对此加以抨击!) – 2016-08-24 17:20:53

+0

它对我不起作用。 VS 2013. C++/CLI。我正在做远程调试。 – empty 2016-08-24 19:24:45