C# 异步按钮事件有时不会';行不通 名称空间知识 { 公共部分类FrmFtpr:表单 { 私有只读ILog_log=LogManager.GetLogger(“Ftp”); 私有CancellationTokenSource\u CancellationTokenSource; 私有IEnumerable GetFtpHost() { //获取所有ftp站点信息 返回ftpHost; } 专用异步任务DoWork() { 而(!\u cancellationTokenSource.IsCancellationRequested) { var ftpHosts=GetFtpHosts(); var ftpTasks=ftpHosts.Select(上传); 等待任务。WhenAll(ftpTasks); } } 专用异步任务上载(FtpHost FtpHost) { //将文件上载到ftp } 私有异步void btnStart\u单击(对象发送方,事件参数e) { _cancellationTokenSource=新的cancellationTokenSource(); _log.Info(“已启动”); btnCancel.Enabled=真; btnStart.Enabled=false; 等待嫁妆(); } 私有异步无效btnCancel\u单击\u 1(对象发送方,事件参数e) { _cancellationTokenSource.Cancel(); _日志信息(“停止”); btnStart.Enabled=true; btnCancel.Enabled=false; } } }

C# 异步按钮事件有时不会';行不通 名称空间知识 { 公共部分类FrmFtpr:表单 { 私有只读ILog_log=LogManager.GetLogger(“Ftp”); 私有CancellationTokenSource\u CancellationTokenSource; 私有IEnumerable GetFtpHost() { //获取所有ftp站点信息 返回ftpHost; } 专用异步任务DoWork() { 而(!\u cancellationTokenSource.IsCancellationRequested) { var ftpHosts=GetFtpHosts(); var ftpTasks=ftpHosts.Select(上传); 等待任务。WhenAll(ftpTasks); } } 专用异步任务上载(FtpHost FtpHost) { //将文件上载到ftp } 私有异步void btnStart\u单击(对象发送方,事件参数e) { _cancellationTokenSource=新的cancellationTokenSource(); _log.Info(“已启动”); btnCancel.Enabled=真; btnStart.Enabled=false; 等待嫁妆(); } 私有异步无效btnCancel\u单击\u 1(对象发送方,事件参数e) { _cancellationTokenSource.Cancel(); _日志信息(“停止”); btnStart.Enabled=true; btnCancel.Enabled=false; } } },c#,C#,上面的代码用于监视某些目录,并将这些目录中的文件上载到不同的FTP 若GetFtpHost返回null或0,表单将冻结,但若GetFtpHost返回一些值,我可以在开始和取消按钮之间切换。winform不会冻结 通过如下修改代码,问题已得到解决。现在,该应用程序可以扫描dirs周期(例如每1分钟一次),如果当前上载未完成,请等待。否则,开始新一轮 namespace knowledge { public partial class FrmFtpr : Form { pr

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


若GetFtpHost返回null或0,表单将冻结,但若GetFtpHost返回一些值,我可以在开始和取消按钮之间切换。winform不会冻结

通过如下修改代码,问题已得到解决。现在,该应用程序可以扫描dirs周期(例如每1分钟一次),如果当前上载未完成,请等待。否则,开始新一轮

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

}
公共部分类FrmFtpr:表单
{
私有只读ILog_log=LogManager.GetLogger(“Ftp”);
私有CancellationTokenSource\u CancellationTokenSource;
私人任务(u Task),;
私有IEnumerable GetFtpHost()
{
//获取所有ftp站点信息
返回ftpHost;
}
专用异步任务上载(FtpHost FtpHost)
{
//将文件上载到ftp
}
私有无效计时器1_刻度(对象发送方,事件参数e)
{
如果(_task!=null&&!_task.IsCompleted)
返回;
var ftpTargets=GetFtpTargets().ToList();
如果(ftpTargets.Count==0)
返回;
_task=task.Factory.StartNew(()=>
{
var tasks=ftpTargets.Select(Upload.ToArray();
Task.WaitAll(任务);
});
}
私有异步void btnStart\u单击(对象发送方,事件参数e)
{
_cancellationTokenSource=新的cancellationTokenSource();
_log.Info(“已启动”);
btnCancel.Enabled=真;
btnStart.Enabled=false;
timer1.Start();
}
私有异步无效btnCancel\u单击\u 1(对象发送方,事件参数e)
{
_cancellationTokenSource.Cancel();
_task.Wait();
_日志信息(“停止”);
timer1.Stop();
btnStart.Enabled=true;
btnCancel.Enabled=false;
}
}

我的猜测是,
GetFtpHosts
是阻塞的原因,这是您没有展示实现的一种方法,因此我们真的没有什么需要做的。我认为您展示的代码中没有任何问题。
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;
    }
}