#c_sharp #async_await #tpl_dataflow
В программе необходимо в отдельном потоке проводить некоторые операции, как например
отправлять запрос серверу и ждать от него ответ. Для реализации использую библиотеку
Dataflow, дабы выполнять это всё последовательно.
Реализовал такой класс:
partial class PoolManager
{
CancellationTokenSource CT;
TransformBlock, string> ActionBlock;
public PoolManager()
{
PM = this;
CT = new CancellationTokenSource();
ActionBlock = new TransformBlock, string>(async n =>
{
await Task.Delay(2000);
string a = "";
try
{
a = n();
}
catch (Exception e) { }
return a;
},
new ExecutionDataflowBlockOptions { CancellationToken = CT.Token });
}
public void Add(Action func, string message)
{
ActionBlock.Post(new Func(delegate () { func(); return message; }));
}
}
И целом работает как нужно, но когда я посылаю в него функцию, внутри которой есть
отправка и ожидание ответа, то на моменте ожидания, интерфейс программы подвисает.
В среднем это 100мс, иногда доходит и до 500мс или 1000мс, что становится очень заметно.
Не понимаю в чём причина, ибо он в отдельном потоке должен идти.
Ответы
Ответ 1
Вопрос решился сам собой. В целом данный код работает вполне корректно, и проблема таилась глубже. В конкретной задаче на которой я тестировал этот код, в TransformBlock отправлялась функция находящаяся в элементе управления UserControl. В этой функции вызывался метод экземпляра класса, и этот метод посылал запрос на сервер и ожидал ответа. Метод был синхронный и потому поток в котором он вызывался должен был блокироваться. Для того, что бы этого не было делал это в паралельном потоке, но основной поток всё равно блокировался. В итоге я обратил внимание, что код в посылаемой функции выполяется через Dispatcher, дабы я мог выполнять заполнение ProgressBar, и следовательно проверив номер потока через Thread.CurrentThread.ManagedThreadId, при входе в функцию и в диспетчер, понял что код внутри Dispatcher выполняется в уже в потоке UI, а не в потоке TransformBlock, от того запрос и проходил в потоке UI, что и вызывало подвисание. Спасибо VladD, за помощь в решении данной проблемы.
Комментариев нет:
Отправить комментарий