2013-06-04 50 views
1

我正在尋找一種方法來創建一個TaskScheduler在主線程中同步運行,以允許將WPF應用程序配置爲單線程用於調試目的。使TaskScheduler同步並運行在主線程

有什麼想法?

現在我使用的樣品LimitedTaskScheduler MSDN上,允許指定併發級別(多少線程使用),這擴展了應用程序啓動之前設置靜態TaskFactory:

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

也許變種調度= TaskScheduler.FromCurrentSynchronizationContext(); ? – jure

+0

它不起作用,如果以這種方式執行InvalidOperationException,則需要創建SynchronizationContext.SetSynchronizationContext(new SynchronizationContext()),但代碼在輔助線程中運行。 –

+0

該代碼是否在單元測試中執行?如果您的應用程序正在運行,它應該可以工作。對於單元測試,請查看CurrentThreadTaskScheduler,http://blogs.msdn.com/b/pfxteam/archive/2010/04/09/9990424.aspx – jure

回答

2

對於測試您可以使用ParallelExtensionsExtras庫中的CurrentThreadTaskScheduler。 基本上它是一個簡單的TaskScheduler,它執行當前線程上的所有任務。

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>(); 
    } 

}