Может ли HttpClient SendAsync не блокировать поток GUI? - PullRequest
1 голос
/ 05 мая 2019

Поток графического интерфейса Windows Forms время от времени останавливается на секунду, а затем во время асинхронного HttpClient SendAsync.За исключением этого, все работает отлично (я получаю данные).Я хочу делать частые и, надеюсь, параллельные запросы к различным серверам для частого обновления экрана.Я пытаюсь запустить несколько запросов, которые публикуют ответы для обработки потоком GUI позже.Код ниже является упрощением моего кода.Я проверил время до и после SendAsync и вижу, что иногда оно составляет до 2 секунд, пока окно GUI заморожено (его нельзя перемещать, прокручивать и т. Д.) И таймер опроса неактивен (счетчик никогда не увеличивается).

Использование async Task DoWork не помогло.

class Worker
{
    HttpClient client = new HttpClient();
    bool busy = false;
    string data = "";
    //public async Task DoWork()
    public async void DoWork()
    {
        if ( busy ) return;
        busy = true;
        HttpRequestMessage request = new HttpRequestMessage(method, requestUrl);
        HttpResponseMessage response = await client.SendAsync( request );
        data = ... from response ...
        busy = false;
    }
}
int counter;
private void Update(object sender, EventArgs e)
{
    ++counter;
    foreach ( Worker worker in workers )
        worker.DoWork();
}
...
List<Worker> workers = ...
var poll = new System.Windows.Forms.Timer();
poll.Tick += Update;
poll.Interval = 250;
poll.Enabled = true;
...

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

SendAsync достаточно асинхронный (даже если он использует потоки внутри). Само обновление пользовательского интерфейса происходит очень медленно и является причиной его зависания.

0 голосов
/ 05 мая 2019

Если вы используете Windows.Forms, вы можете рассмотреть BackgroundWorker

...