Как я могу установить метод задержки для моей функции загрузки C#

#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);