繁体   English   中英

异步按钮事件有时不起作用

[英]async button event sometimes doesn't work

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;
        }
    }

}

上面的代码用于监视某些目录,并将这些目录中的文件上传到不同的ftps。

如果GetFtpHost返回null或0,则窗体将冻结,但是如果GetFtpHost返回某个值,则可以在开始和取消按钮之间进行切换。 Winform不会冻结。

通过下面的修改代码,此问题已解决。 现在,该应用程序可以扫描扫描周期(例如每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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM