Ответ 1
SpinWait.SpinUntil
- правильный ответ, независимо от того, где вы собираетесь разместить этот код. SpinUntil предлагает "приятное сочетание спиннинга, уступая и спящего между вызовами" .
Мне нужно остановить поток, пока другой поток не установит логическое значение , и я не хочу делиться между ними событием.
В настоящее время у меня есть следующий код с использованием Sleep (и код, который я хочу изменить):
while (!_engine.IsReadyToStop())
{
System.Threading.Thread.Sleep(Properties.Settings.Default.IntervalForCheckingEngine);
}
Любые идеи?
ИЗМЕНИТЬ, ЧТОБЫ ЗАЩИТИТЬ ВЕЩИ:
Существует объект, называемый _engine класса, который у меня нет. Я не могу изменить его, поэтому я не хочу делиться событиями между ними. Мне нужно подождать, пока метод этого класса не вернет true.
SpinWait.SpinUntil
- правильный ответ, независимо от того, где вы собираетесь разместить этот код. SpinUntil предлагает "приятное сочетание спиннинга, уступая и спящего между вызовами" .
Если вы используете C# 4.0
, вы можете использовать:
Task t = Task.Factory.StartNew (() => SomeCall(..));
t.Wait();
Используя метод Task.Wait.
Если вы запускаете несколько задач один за другим, вы можете использовать Task.ContinueWith:
Task t = Task.Factory.StartNew (() =>SomeCall(..)).
ContinueWith(ExecuteAfterThisTaskFinishes(...);
t.Wait();
объявить как
AutoResetEvent _ReadyToStop = new AutoResetEvent(false);
и использовать как
_ReadyToStop.WaitOne();
и
_ReadyToStop.Set();
Подробнее см. Примитивы синхронизации в .NET