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