Интерфейс C # для AWS S3 не обновляется - PullRequest
0 голосов
/ 31 мая 2018

Я создаю приложение для загрузки в 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();
}

Проблемазаключается в том, что он обновляется только при загрузке файла, но событие запускается чаще.Когда я загружаю последний файл (12MB);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 Ответ

0 голосов
/ 01 июня 2018

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

Не имея возможности попробовать это сам, вот, что я думаю, вам нужно сделать.1008 * Два null, которые я добавил, предназначены для токенов отмены, я не могу сказать из документов AWS, разрешено ли передавать нулевой токен, если нет, создайте его и передайте.

...