对于ConcurrentExclusiveSchedulerPair
,在后台保证同一线程是ExclusiveScheduler
的固有组成部分吗?
例如,对于一个我想在后台线程上运行的SDK,但是调用可能需要一段时间。例如:
var csp = new ConcurrentExclusiveSchedulerPair();
...
// Start SdkStuff() - this may not take long
Task.Factory.StartNew(() => SdkStuff(),
Cancel.Token,
TaskCreationOptions.DenyChildAttach,
csp.ExclusiveScheduler);
// And then a few days later, without having any tasks
// given to it, is this second SDK call GUARANTEED to be
// on the same thread?
Task.Factory.StartNew(() => MoreSdkStuff(),
Cancel.Token,
TaskCreationOptions.DenyChildAttach,
csp.ExclusiveScheduler);
是否保证SdkStuff
与MoreSdkStuff
在同一线程上运行?
编辑:
我不仅对专门运行的任务不感兴趣,它们还必须在同一线程上-尽管后者是执行前者的一种方式,但我需要知道,它将在同一线程上。据我所知,文档没有对此进行说明。如果有的话,请指出。
答案 0 :(得分:1)
文档讨论了排他保证和并发保证。它没有说在同一线程上运行。这应该足够清楚,它不能做出这样的保证。
如果要确保代码在同一线程上运行,请考虑使用Microsoft的Reactive Framework(NuGet“ System.Reactive”)。然后,您可以这样做:
var els = new EventLoopScheduler();
IDisposable subscription1 = els.Schedule(() => SdkStuff());
IDisposable subscription2 = els.Schedule(() => MoreSdkStuff());
您甚至可以使用此库来安排在特定时间。
IDisposable subscription2 = els.Schedule(TimeSpan.FromHours(24.0), () => MoreSdkStuff());
IDisposable subscription3 = els.Schedule(DateTimeOffset.Now.AddHours(8.0), () => MoreSdkStuff());
在这些订阅中的任何一个上调用.Dispose()
将取消待处理的操作。
您甚至可以安排重复任务:
IDisposable subscription4 =
Observable
.Interval(TimeSpan.FromHours(2.0), els)
.SelectMany(x => Observable.Start(() => SdkStuff()))
.Subscribe();
甚至:
IDisposable subscription5 =
els
.Schedule(TimeSpan.FromHours(1.0), a =>
{
MoreSdkStuff();
a(TimeSpan.FromHours(0.5));
});
最后一个从1小时开始,然后每30分钟执行一次。
关键是EventLoopScheduler
确保所有操作都在一个线程上进行。