InvalidOperationException происходит при отмене токена

1

У меня проблема с передачей cancelationtoken функции. Я получаю InvalidOperationException: "Вызов потока не может получить доступ к объекту, потому что он принадлежит другому потоку".

Вот мой код.

private CancellationTokenSource cts;
private CancellationToken ct;
public MainWindow()
    {
        InitializeComponent();
        client = new WebClient();
        cts = new CancellationTokenSource();
        ct = cts.Token;
    }
private void one_Click(object sender, RoutedEventArgs e)
    {
        cts = new CancellationTokenSource();
        ct = cts.Token;
        Task myTask = Task.Run(() => Save(textBox.Text, ct));
    }
private void Save(string url, CancellationToken ct)
    {
        //var url = ThirdAddressTextBox.Text;

        var html = client.DownloadString(url);
        var doc = new HtmlDocument();
        doc.LoadHtml(html);

        var imageNodesList =
            doc.DocumentNode.SelectNodes("//img")
            .Where(
                    x =>
                        x.Name == "img")
                .Select(x => x)
                .ToList();
        int temp= 0;
        foreach (var htmlNode in imageNodesList)
        {
            if (ct.IsCancellationRequested)
            {
                return;
            }
            client.DownloadFile(new Uri(htmlNode.Attributes["src"].Value), @"C:\Users\" + temp+ ".jpg");
            ++licznik;
        }
        client.DownloadFile(new Uri(url), @"C:\Users\");
        return;
    }

Кто-нибудь знает, как решить эту проблему с этой ошибкой?

Теги:
asynchronous
cancellation
cancellationtokensource
task

1 ответ

3
Лучший ответ

Я предполагаю, что вы получаете исключение, потому что вы читаете textBox.Text из другого потока.

Попробуй это:

private void one_Click(object sender, RoutedEventArgs e)
{
    cts = new CancellationTokenSource();
    ct = cts.Token;
    string url = textBox.Text;//Read it in UI thread itself
    Task myTask = Task.Run(() => Save(url, ct));
}

Если это не решает проблему, обратитесь за дополнительной информацией об исключении.

  • 0
    Это помогает спасибо :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню