Запись в локальную переменную из потока

157
26 апреля 2019, 23:50

При нажатии кнопки "указать", указывается путь к папке с файлами, получается список файлов и по очередной загружается в picturebox и параллельно в асинхронном методе по картинке генерируются некие данные, и после их генерации становится доступна вторая кнопка. Вопрос как записать результат асинхронного метода в переменную Data ?

public string[] Images;
public string[] Data;
public int count = 0;
private static readonly HttpClient client = new HttpClient(new HttpClientHandler
{
    AllowAutoRedirect = true,
    UseCookies = true,
    CookieContainer = new CookieContainer()
});
public void LoadImage()
{
  Image CurrentImage = Image.FromFile(Images[this.count]);
  pictureBox1.Image = CurrentImage;
  LoadJSONAsync(CurrentImage);
}

    public async void LoadJSONAsync(Image Image)
    {
        /* GET LINE */
        string Line = "LINE";
        //Нужно записать результат асинхронного вызова в переменную класса Data
        this.Data[this.count] = Line;
        button2.Enabled = true;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        if(folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            textBox1.Text = folderBrowserDialog1.SelectedPath;
            Images = Directory.GetFiles(textBox1.Text);
            this.count = 0;
            LoadImage();
        }
    }
    private void button2_Click(object sender, EventArgs e)
    {
       //Работа с this.Data[this.count]
    }

Answer 1

Как насчет такого подхода?

public Task<string> LoadImage()
{
    Image CurrentImage = Image.FromFile(Images[this.count]);
    pictureBox1.Image = CurrentImage;
    return LoadJSONAsync(CurrentImage);
}   
public async Task<string> LoadJSONAsync(Image Image)
{
    /* GET LINE */
    string Line = "LINE";   
    return Line;
}
private async void button1_Click(object sender, EventArgs e)
{
    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
    {
        textBox1.Text = folderBrowserDialog1.SelectedPath;
        Images = Directory.GetFiles(textBox1.Text);
        this.count = 0;
        var line = await LoadImage(); // загрузка строки
        this.Data[this.count] = line; // делайте с результатом все, что хотите
        button2.Enabled = true; // UI логика не размазана по методам
    }
}
READ ALSO
Цепочное освобождение объектов

Цепочное освобождение объектов

Все объекты являются неуправляемыми за исключением некоторых типов

165
Как заблокировать клавиатуру и мышь?

Как заблокировать клавиатуру и мышь?

Просто как заблокировать клавиатуру и мышь? Уже смотрел эту страницу http://wwwcyberforum

302
Получить Атрибуты Директории C#

Получить Атрибуты Директории C#

В C# имеется вот такая конструкция:

203
Работа со счетчиком через GPRS модем и COM порт

Работа со счетчиком через GPRS модем и COM порт

Имеется связка "Компьютер - GPRS модем - счетчик стандарта ГОСТ IEC 61107—2011"GPRS модем подключен к COM порту

149