0

我正在寻找一种方法来创建在主线程中同步运行的 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);
}
4

2 回答 2

4

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

于 2013-06-04T15:10:35.243 回答
0

如果你想创建一个 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>();
    }
}
于 2018-02-20T23:27:23.997 回答