Интерфейс 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, разрешено ли передавать нулевой токен, если нет, создайте его и передайте.