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;
}
}
}
上面的代码用于监视某些目录,并将这些目录中的文件上传到不同的ftps。异步按钮事件有时不起作用
如果GetFtpHost返回null或0,表单将冻结,但如果GetFtpHost返回某个值,则可以在开始和取消按钮之间切换。 winform不会冻结。
我的猜测是'GetFtpHosts'是什么阻挡,这是该一种方法你没有显示出实现,所以对我们来说真的没有太多的工作要做,我没有看到你到目前为止显示的代码有任何问题。 – Servy 2013-04-25 18:47:19