Интерфейс C# для AWS S3 не обновляется

Я создаю приложение для загрузки в C#, которое загружает файлы из хранилища Amazon AWS S3. Я могу загрузить файл без проблем, но я пытаюсь создать событие прогресса.

Для создания события я использую следующий код в функции загрузки:

Application.DoEvents();
response2.WriteObjectProgressEvent += displayProgress;
Application.DoEvents();

Созданный мной обработчик событий выглядит следующим образом:

private void displayProgress(object sender, WriteObjectProgressArgs args)
{
    // Counter for Event runs
    label7.BeginInvoke(new Action(() => label7.Text = (Convert.ToInt32(label7.Text)+1).ToString()));

    Application.DoEvents(); 
    // transferred bytes
    label4.BeginInvoke(new Action(() => label4.Text = args.TransferredBytes.ToString()));

    Application.DoEvents();
    // progress bar
    progressBar1.BeginInvoke(new Action(() => progressBar1.Value = args.PercentDone));

    Application.DoEvents();
}

Проблема в том, что он обновляется только при загрузке файла, но событие запускается чаще. Когда я загружаю последний файл (12 МБ); lable7 (счетчик событий) переходит с 3 на 121, поэтому я знаю, что он работает, но просто не обновляется.

Я также попробовал просто "стандартный" Invoke, но у меня был тот же результат.

Дополнительный код функции:

AmazonS3Config S3Config = new AmazonS3Config
{
    ServiceURL = "https://s3.amazonaws.com"
};

var s3Client = new AmazonS3Client(stuff, stuff, S3Config);

ListBucketsResponse response = s3Client.ListBuckets();

GetObjectRequest request = new GetObjectRequest();
request.BucketName = "dr-test";
request.Key = locationoffile[currentdownload];


GetObjectResponse response2 = s3Client.GetObject(request);

response2.WriteObjectProgressEvent += displayProgress;


string pathlocation = Path.GetDirectoryName(Directory.GetCurrentDirectory()) + "\\" + Instrument[currentdownload] + "\\" + NewFileName[currentdownload];

response2.WriteResponseStreamToFile(pathlocation);

1 ответ

Решение

Вы не используете асинхронный вызов для GetObject или же WriteResponseStreamToFileТаким образом, поток пользовательского интерфейса (из которого вы его вызываете) будет заблокирован, что означает, что он не может обновлять прогресс (независимо от того, DoEvents звонки, которые вообще считаются злыми и вам следует избегать).

На самом деле, не имея возможности попробовать это сам, вот что я думаю, что вам нужно сделать.

private async void Button_Click(object sender, EventArgs e)
{
   foreach(...download....in files to download){

        AmazonS3Config S3Config = new AmazonS3Config
        {
            ServiceURL = "https://s3.amazonaws.com"
        };

        var s3Client = new AmazonS3Client(stuff, stuff, S3Config);

        ListBucketsResponse response = s3Client.ListBuckets();

        GetObjectRequest request = new GetObjectRequest();
        request.BucketName = "dr-test";
        request.Key = locationoffile[currentdownload];



        GetObjectResponse response2 = await s3Client.GetObjectAsync(request, null);

        response2.WriteObjectProgressEvent += displayProgress;



        string pathlocation = Path.GetDirectoryName(Directory.GetCurrentDirectory()) + "\\" + Instrument[currentdownload] + "\\" + NewFileName[currentdownload];

        await response2.WriteResponseStreamToFileAsync(pathlocation, null);

  }
 }

Два nullЕсли я добавил токены для отмены токенов, я не могу узнать из документов AWS, разрешено ли передавать нулевой токен, если нет, создайте его и передайте.

Другие вопросы по тегам