Похоже, вы хотите что-то вроде этого.Пожалуйста, исправьте меня, если я неверно истолковываю ваши намерения ...
Во-первых, в начале вы должны задать долгосрочную задачу, чтобы она не потребляла поток из пула потоков, а создавала новый...
private void ViewBase_Loaded(object sender, RoutedEventArgs e)
{
// store this references as a private member, call Cancel() on it if UI wants to stop
_cancelationTokenSource = new CancellationTokenSource();
new Task(() => CreateAndStartReportRequestTask(), _cancelationTokenSource.Token, TaskCreationOptions.LongRunning).Start();
}
Затем в цепочке просмотра отчетов выполняйте цикл до тех пор, пока не будет установлено значение IsCancelRequested
.Если работы нет, просто подождите на токене отмены 15 секунд (таким образом, если отменено, то проснется раньше).
private bool CheckReportRequestsAndGenerateReports()
{
while (!_cancellationTokenSource.Token.IsCancelRequested)
{
var possibleReportRequest = //Some linq query
var reportRequestTask = Task.Factory.StartNew(() => noRequest = CheckReportRequestsAndGenerateReports(), _cancellationTokenSource.Token);
if (noRequest)
{
// it looks like if no request, you want to sleep 15 seconds, right?
// so we'll wait to see if cancelled in next 15 seconds.
_cancellationTokenSource.Token.WaitHandle.WaitOne(15000);
}
else
{
// otherwise, you just want to wait till the task is completed, right?
reportRequestTask.Wait(_cancellationTokenSource.Token);
}
}
}
Я бы также не хотел, чтобы ваша задача запускала больше задач.У меня такое чувство, что ты раскручиваешь столько, что потребляешь слишком много ресурсов.Я думаю, что основной причиной сбоя вашей программы было то, что у вас было:
if (noRequest)
{
reportRequestTask.Wait(15000);
reportRequestTask = null;
}
Это вернется немедленно, а не ждать 15 секунд, потому что поток уже завершен.Переключение на токен отмены (или Thread.Sleep()
, но тогда вы не можете так просто его прервать) даст вам необходимое ожидание обработки.
Надеюсь, это поможет, дайте мне знать, если яна мои предположения.