Visual Studio 2015 - 如何从异步方法获取任务列表?

时间:2016-06-07 22:04:07

标签: c# .net asynchronous async-await

使用VS2015调试器,如何在特定上下文中访问所有任务的列表?例如,在下面的SAMPLE中,我希望看到有两个任务:"测试"和" TestAsync"。到目前为止,我只能看到第一个 - 我无法从异步方法中看到隐式任务。

PARALLEL STACKS / TASKS WINDOWS(Windows 8.1 +)

已于6/9/16更新

"并行堆栈"和"任务" VS2015中的窗口是一种简单的方法,但是有一个未记录的限制阻止它们在Windows 7中工作(我正在使用它)。

在Windows 7中,他们只会列出明确创建的"任务"对象。例如,在下面的SAMPLE中,当我期待两个任务时,我可以看到一个用于"测试"的任务("测试"和" TestAsync")

根据MSDN Using the Tasks Window

  

在托管代码中,您可以在使用System.Threading.Tasks.Task对象或使用await和async关键字时使用“任务”窗口

但是,在Windows 7中,它不能与async / await一起使用。这在VS2013 Debug/Windows/Tasks: "No tasks to display"中得到了进一步强化,这表明这是一个操作系统问题,如果我运行的是Windows 8.1或更高版本,它就会起作用。我还没有在Windows 10中测试过。

使用物体检查?

如果我不能使用" Parallel Stacks",是否有一些管理器对象我可以检查以获得可枚举的任务列表?

例如,如果在WPF应用程序的异步方法中放置断点,并查看callstack,则可能会看到

  • SynchronizationContextAwaitTaskContinuation
  • 的DispatcherOperation
  • 的ExecutionContext

我已经尝试过检查"任务t2"对象,但尚未找到任何有用的东西。例如。   - Task.ExecutingTaskScheduler为null   - Task.CapturedContext不为null,但没有任何有用的引用   - Dispatcher.CurrentDispatcher._queue可能有用吗?   - TaskScheduler.Current.ScheduledTasks为空

样品

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace TaskWatchSimple
{
    class Program
    {
        static Task t1;
        static Task t2;

        static void Main(string[] args)
        {
            t1 = new Task(Test);
            t1.Start();
            t2 = TestAsync();

            Debugger.Break();
        }

        static async Task TestAsync()
        {
            for (int i = 0; i < 5; i++)
                await Task.Delay(2000);
        }

        static void Test()
        {
            for (int i = 0; i < 5; i++)
                Thread.Sleep(2000);
        }
    }
}

环境

  • VS2015 Update 2
  • Windows 7 64位
  • .NET 4.5.2(也尝试过4.6.1)

0 个答案:

没有答案