Я пытаюсь выполнить итерацию через цикл, нажав кнопку запуска и остановив ее, нажав кнопку остановки. Я использую await Task.Run(() =>
, он работает в ожидании. Но когда я снова нажимаю кнопку запуска, я получаю TargetInvokationException в Application.Run(new Form1());
.TargetInvokationException в Application.Run (новый Form1());
Мой код ниже
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CancellationTest
{
public partial class Form1 : Form
{
private readonly SynchronizationContext synchronizationContext;
private DateTime previousTime = DateTime.Now;
CancellationTokenSource cts = new CancellationTokenSource();
public Form1()
{
InitializeComponent();
synchronizationContext = SynchronizationContext.Current;
}
private async void ButtonClickHandlerAsync(object sender, EventArgs e)
{
button1.Enabled = false;
var count = 0;
CancellationToken token = cts.Token;
await Task.Run(() =>
{
try
{
for (var i = 0; i <= 5000000; i++)
{
token.ThrowIfCancellationRequested();
UpdateUI(i);
count = i;
}
}
catch (System.OperationCanceledException)
{
MessageBox.Show("Canceled");
}
}, token);
label1.Text = @"Counter " + count;
button1.Enabled = true;
}
public void UpdateUI(int value)
{
var timeNow = DateTime.Now;
if ((DateTime.Now - previousTime).Milliseconds <= 50) return;
synchronizationContext.Post(new SendOrPostCallback(o =>
{
label1.Text = @"Counter " + (int)o;
}), value);
previousTime = timeNow;
}
private void button2_Click(object sender, EventArgs e)
{
cts.Cancel();
}
}
}
Может кто-нибудь объяснить, почему это происходит и как решить эту проблему.
Исправьте необработанную диагностику исключения, что бы это ни потребовалось. С такими исключениями вы всегда ** хотите знать внутреннее исключение. Нажмите ссылку «Подробнее» в диалоговом окне «Ассистент исключения». Довольно легко увидеть, что CancellationToken устарел. –