2013-04-25 2 views
2
namespace knowledge 
{ 
    public partial class FrmFtpr : Form 
    { 

    private readonly ILog _log = LogManager.GetLogger("Ftp"); 
     private CancellationTokenSource _cancellationTokenSource; 

    private IEnumerable<FtpHost> GetFtpHost() 
     { 
      //get all ftp site info 

      return ftpHost; 
     } 

     private async Task DoWork() 
     { 
      while (!_cancellationTokenSource.IsCancellationRequested) 
      { 
       var ftpHosts = GetFtpHosts(); 
       var ftpTasks = ftpHosts.Select(Upload); 
       await Task.WhenAll(ftpTasks); 
      } 
     } 

     private async Task Upload(FtpHost ftpHost) 
     { 
      //upload files to a ftp 
     } 


     private async void btnStart_Click(object sender, EventArgs e) 
     { 
      _cancellationTokenSource = new CancellationTokenSource(); 

      _log.Info(" Started"); 
      btnCancel.Enabled = true; 
      btnStart.Enabled = false; 
      await DoWork(); 
     } 

     private async void btnCancel_Click_1(object sender, EventArgs e) 
     { 
      _cancellationTokenSource.Cancel(); 
      _log.Info(" Stoped"); 
      btnStart.Enabled = true; 
      btnCancel.Enabled = false; 
     } 
    } 

} 

Если GetFtpHost возвращает значение null или 0, форма замерзает, но если GetFtpHost возвращает некоторое значение, я могу переключаться между кнопкой «Пуск» и «Отмена». winform не замерзает.событие async иногда не работает

+2

Я думаю, что 'GetFtpHosts' является то, что блокирование, и это один метод, для которого вы не показывали реализацию, поэтому нам действительно нечего делать. Я не вижу никаких проблем в коде, который вы показали до сих пор. – Servy

ответ

0

С помощью модифицированного кода, как описано ниже, проблема решена. Теперь это приложение может сканировать DIRS период (каждую 1 минуту, например), а затем, если текущая загрузка не завершена, ждать. В противном случае начать новый раунд.

public partial class FrmFtpr : Form 
{ 
    private readonly ILog _log = LogManager.GetLogger("Ftp"); 
    private CancellationTokenSource _cancellationTokenSource; 
    private Task _task; 

    private IEnumerable<FtpHost> GetFtpHost() 
    { 
     //get all ftp site info 

     return ftpHost; 
    } 


    private async Task Upload(FtpHost ftpHost) 
    { 
     //upload files to a ftp 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (_task != null && !_task.IsCompleted) 
      return; 

     var ftpTargets = GetFtpTargets().ToList(); 

     if (ftpTargets.Count == 0) 
      return; 

     _task = Task.Factory.StartNew(() => 
      { 
       var tasks = ftpTargets.Select(Upload).ToArray(); 
       Task.WaitAll(tasks); 
      }); 
    } 


    private async void btnStart_Click(object sender, EventArgs e) 
    { 
     _cancellationTokenSource = new CancellationTokenSource(); 
     _log.Info(" Started"); 
     btnCancel.Enabled = true; 
     btnStart.Enabled = false; 
     timer1.Start(); 
    } 

    private async void btnCancel_Click_1(object sender, EventArgs e) 
    { 
     _cancellationTokenSource.Cancel(); 
     _task.Wait(); 
     _log.Info(" Stoped"); 
     timer1.Stop(); 
     btnStart.Enabled = true; 
     btnCancel.Enabled = false; 
    } 
} 
Смежные вопросы