У меня проблема с передачей 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;
}
Кто-нибудь знает, как решить эту проблему с этой ошибкой?
Я предполагаю, что вы получаете исключение, потому что вы читаете 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));
}
Если это не решает проблему, обратитесь за дополнительной информацией об исключении.