Я создал задачу, которая создает строку XML. Задача может длиться несколько секунд. Когда задача не завершена через 5 секунд, я хочу отменить задачу «гладко» и продолжить запись остальной части XML. Поэтому я встроил отмену в свою задачу. Но хотя я вижу следующее сообщение в журнале:
- Превышение времени ожидания ProcessInformationTask
Я также вижу эту строку в моем журнале
Добавление информации о процессе заняло 10001 мс
Интересно, почему это может произойти, потому что я хочу отменить задачу через 5 секунд (если она не завершена). Поэтому я ожидаю, что задача будет длиться максимум 5 секунд. Как я могу это решить? Возможно, отмена не настроена должным образом?
Код, в котором я вызываю свою задачу
string additionalInformation = null;
var contextInfo = new StringBuilder();
var xmlWriterSettings = new XmlWriterSettings()
{
OmitXmlDeclaration = true,
ConformanceLevel = ConformanceLevel.Fragment
};
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
using (XmlWriter xmlWriter = XmlWriter.Create(contextInfo, xmlWriterSettings))
{
try
{
xmlWriter.WriteStartElement("AdditionalInformation");
//Write xml (not long running)
var watch = System.Diagnostics.Stopwatch.StartNew();
string processInformation = AddProcessesInformation(xmlWriterSettings);
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
Log.Info("Adding the process information took : " + elapsedMs + " ms");
if (!string.IsNullOrEmpty(processInformation))
{
xmlWriter.WriteRaw(processInformation);
}
//Write xml (not long running)
xmlWriter.WriteEndElement();
additionalInformation = contextInfo.ToString();
}
catch (Exception e)
{
Log.Info("An exception occured during writing the additional information: " + e.Message);
return false;
}
return true;
}
Метод задачи
private static string AddProcessesInformation(XmlWriterSettings xmlWriterSettings)
{
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var contextInfo = new StringBuilder();
var processInformationTask = Task<string>.Factory.StartNew(() =>
{
if (token.IsCancellationRequested)
{
Log.Info("Cancellation request for the ProcessInformationTask");
}
Thread.Sleep(10000);
return "Ran without problems'";
}, token);
if (!processInformationTask.Wait(5000, token))
{
Log.Info("ProcessInformationTask timed out");
tokenSource.Cancel();
}
return processInformationTask?.Result;
}
xmlWriter
обычаи не требуются - person Sergey Berezovskiy   schedule 30.03.2017