Как я могу изменить свой код, чтобы использовать фоновые рабочие вместо фоновых потоков - PullRequest
0 голосов
/ 26 июня 2019

У меня есть приложение winform, делающее запросы API и записывающее ответы в текстовые поля. Запросы могут занимать несколько минут, чтобы приложение не зависало при каждом запросе API. Я использую фоновые потоки. Однако вместо этого я хотел бы использовать фоновых рабочих, чтобы избежать большого количества делегатов, необходимых для каждого элемента управления формы. Как я могу изменить свой код, чтобы использовать фоновые рабочие вместо?

Я посмотрел вокруг, и большая часть информации, которую я нашел о фоновых рабочих, связана с индикаторами выполнения, и я не могу понять, как использовать фоновых рабочих для того, что я делаю.

 private delegate void TextBox1WriteDelegate(string i);
    private void TextBox1Write(string i)
    {
        textBox1.Text = i;
    }

    public void GetApiData()
    {
        using (HttpClient httpClient = new HttpClient())
        {
            var response = httpClient.GetAsync("http://apiendpoint.com").Result;
            textBox1.Invoke(new TextBox1WriteDelegate(TextBox1Write), response.RequestMessage.ToString());
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Thread t = new Thread(GetApiData);
        t.IsBackground = true;
        t.Start();
    }

1 Ответ

0 голосов
/ 26 июня 2019

Достаточно просто сделать фонового работника .. как такового:

    private void button2_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();

        bw.DoWork += (a, b) => GetApiData();
    }

Но это не обязательно решает проблему делегата ...

Чтобы исключить определенный делегатизмените GetApiData () на:

    public void GetApiData()
    {
        using (HttpClient httpClient = new HttpClient())
        {
            var response = httpClient.GetAsync("http://apiendpoint.com").Result;
            textBox1.Invoke((Action)delegate 
            { 
              textBox1.Text = response.RequestMessage.ToString(); 
            });
        }
    }

Затем вы можете удалить определение делегата.

Вы также можете пройти весь путь и сделать это:

    private void button3_click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();

        bw.DoWork += (a, b) =>
        {
            using (HttpClient httpClient = new HttpClient())
            {
                var response = httpClient.GetAsync("http://apiendpoint.com").Result;
                textBox1.Invoke((Action)delegate 
                { 
                   textBox1.Text = response.RequestMessage.ToString(); 
                });
            }
        };
    }

Устранение всех функций.Зависит от того, собираетесь ли вы повторно использовать данные GetAPI где-либо еще

...