#c# #winforms
#c# #winforms
Вопрос:
Я использую функцию загрузки в своем настольном приложении. я хочу, чтобы, если функция загрузки стала неудачной, этот метод повторил попытку ее загрузки. В настоящее время, когда загрузка не выполняется, это ошибка необработанного исключения. мне нужно решение этого
**This is function**
async Task Uploaded()
{
using (var dbx = new DropboxClient(token))
{
bmp = new Bitmap(picboxcapture.Image);
string folder = "/folder/" Login.recuser "";
string filename = DateTime.Now.ToString() " " " " MyTodo_Project.rectsk ".JPG";
string URL = picboxcapture.Image.ToString();
ImageConverter converter = new ImageConverter();
MemoryStream(File.ReadAllBytes(@"C:UsershomeDownloadsFazalNEwTEst.JPG"));
byte[] bytes = (byte[])converter.ConvertTo(picboxcapture.Image, typeof(byte[]));
var mem = new MemoryStream(bytes);
var updated = dbx.Files.UploadAsync(folder "/" filename,
WriteMode.Overwrite.Instance, body: mem);
updated.Wait();
var tx = dbx.Sharing.CreateSharedLinkWithSettingsAsync(folder "/" filename);
tx.Wait();
URL = tx.Result.Url;
}
}
**The function call**
private async void save_Load(object sender, EventArgs e)
{
await Uploaded();
}
I want that when upload unsuccessful then it will retry to upload it in page load event . how can
i do this in C#
Ответ №1:
Просто напишите свой собственный обработчик повторных попыток. Или используйте Polly (рекомендуется, так как это зрелая и очень успешная библиотека).
Однако это пример того, как вы могли бы создать свой собственный.
Учитывая
public class RetriesExceededException : Exception
{
public RetriesExceededException() { }
public RetriesExceededException(string message) : base(message) { }
public RetriesExceededException(string message, Exception innerException) : base(message, innerException) { }
}
public static async Task RetryOnExceptionAsync(int retryCount, int msDelay, Func<Task> func)
{
for (var i = 0; i < retryCount; i )
{
try
{
await func.Invoke();
return;
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
{
if (i == retryCount - 1)
throw new RetriesExceededException($"{retryCount} retries failed", ex);
}
await Task.Delay(msDelay)
.ConfigureAwait(false);
}
}
Использование
await RetryOnExceptionAsync(3, 1000, Uploaded);