Является ли он неотъемлемой частью 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?
Обновлено:
Меня интересуют не только задачи, выполняемые исключительно, они также должны быть в одном потоке - хотя последнее является способом выполнения первого, мне нужно знать, он будет в том же потоке. Насколько я понимаю, в документации это не указано. Если у вас есть, укажите на это.
Я сделал. Я прочитал все предложение, в котором описывается, что он делает. Это не отвечает на мой вопрос.
Не стесняйтесь цитировать бит, который конкретно отвечает на мой вопрос о гарантиях потоков. Я этого не вижу.
В документации говорится об исключительных и параллельных гарантиях. Здесь ничего не говорится о работе в одном потоке. Это должно быть достаточно ясно, что это не так.
Так почему вы спросили, читал ли я документы, если они не отвечают на вопрос?
Они делают; если бы была гарантия работы в одном потоке, в документации бы это упоминалось.
Я считаю это наивным. Он содержит одно предложение документации. Едва ли это полно, не так ли? Я не собираюсь считать, что каждая прочитанная мною документация является исчерпывающей. Сама суть моего вопроса заключается в том, что я вижу, что это не дает никаких гарантий, но я немного удивлен этим, так как это может быть полезно (и будет для меня). Я ценю ваш ответ ниже, но не ехидное отношение «я не должен был задавать вопрос». Это не очень похоже на StackOverflow.
Извини, я не пытаюсь скучать. Я просто спрашивал.
О, спасибо. Приятно знать;) Спасибо за уделенное время.
Я предположил, что голос против был вашим, что в сочетании с вашим первым комментарием = ехидный! Приносим извинения за это предположение.
Нет, не мой голос против.





В документации говорится об исключительных и параллельных гарантиях. Здесь ничего не говорится о работе в одном потоке. Это должно быть достаточно ясно, чтобы не давать таких гарантий.
Если вы хотите, чтобы код выполнялся в одном потоке, рассмотрите возможность использования 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 гарантирует, что все операции выполняются в одном потоке.
Вы читали документы? msdn.microsoft.com/en-us/library/…