2013-06-04 1 views
1

메인 스레드에서 동 기적으로 실행되는 TaskScheduler를 생성하여 WPF 응용 프로그램을 디버깅 목적으로 단일 스레드로 구성 할 수있는 방법을 찾고 있습니다.TaskScheduler를 동 기적으로 만들고 메인 스레드에서 실행

아이디어가 있으십니까?

지금 나는 응용 프로그램이 시작하기 전에 정적 TaskFactory를 설정하는 동시성 레벨 (얼마나 많은 스레드가 사용) 및이 확장을 지정할 수 있도록하는 MSDN의 샘플 LimitedTaskScheduler을 사용하고 있습니다 : 테스트를 위해

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

어쩌면 VAR 스케줄러 = TaskScheduler.FromCurrentSynchronizationContext(); ? – jure

+0

InvalidOperationException을 수신하는 방식으로 SynchronizationContext.SetSynchronizationContext (새 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>(); 
    } 

}