[英]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.