同步创建TaskScheduler并在主线程中运行

时间:2013-06-04 13:32:33

标签: c# wpf asynchronous async-await taskfactory

我正在寻找一种方法来创建一个在主线程中同步运行的TaskScheduler,以允许将WPF应用程序配置为单个线程以进行调试。

有什么想法吗?

现在我在MSDN上使用示例LimitedTaskScheduler,它允许指定并发级别(使用多少个线程),以及此扩展在应用程序启动之前设置静态TaskFactory:

void SetOnTaskFactory(TaskFactory taskFactory)
{
    const BindingFlag = BindingFlags.Static | BindingFlags.NonPublic
    var field = typeof(Task).GetField("s_factory", BindingFlag);
    field.SetValue(null, taskFactory);
}

2 个答案:

答案 0 :(得分:3)

出于测试目的,您可以使用ParallelExtensionsExtras库中的CurrentThreadTaskScheduler。 基本上它是一个简单的TaskScheduler,它执行当前线程上的所有任务。

答案 1 :(得分:-1)

如果要创建SynchronousTaskScheduler,可以使用以下代码执行此操作。

void Main()
{
    SynchronousTaskScheduler taskScheduler = new SynchronousTaskScheduler();
    for (int i = 0; i < 100; i++)
    {
        Task.Factory.StartNew(() => SomeMethod(i), CancellationToken.None, TaskCreationOptions.None, taskScheduler);
    }
}

void SomeMethod(int number)
{
    $"Scheduled task {number}".Dump();
}

// Define other methods and classes here
class SynchronousTaskScheduler : TaskScheduler
{
    public override int MaximumConcurrencyLevel
    {
        get { return 1; }
    }

    protected override void QueueTask(Task task)
    {
        TryExecuteTask(task);
    }

    protected override bool TryExecuteTaskInline(
        Task task,
        bool taskWasPreviouslyQueued)
    {
        return TryExecuteTask(task);
    }

    protected override IEnumerable<Task> GetScheduledTasks()
    {
        return Enumerable.Empty<Task>();
    }

}