Как использовать функцию SYNCHRONOUS DownloadString WebClients без блокировки пользовательского интерфейса?
Я пытаюсь загрузить строку в отдельном потоке без пользовательского интерфейса, и когда загрузка будет завершена, обновите пользовательский интерфейс, но я хочу сделать это без зависания пользовательского интерфейса, поэтому я попытался создать поток, но это не сработало, и затем я попытался создать поток в этом потоке, но это также не сработало, как я могу вызвать функцию downloadstring без зависания интерфейса?
public partial class Form1 : Form
{
private delegate void displayDownloadDelegate(string content);
public Thread downloader, web;
public Form1()
{
InitializeComponent();
}
// Go (Download string from URL) button
private void button1_Click(object sender, EventArgs e)
{
textBox1.Enabled = false;
string url = textBox1.Text;
Thread web = new Thread(() => webDownload(url));
web.Start();
}
// Go (sorting) button
private void button2_Click(object sender, EventArgs e)
{
}
public void webDownload(string address)
{
Thread next = new Thread(() => downloading(address));
next.Start();
// next.Join();
}
public void downloading(string address){
using (WebClient client = new WebClient())
{
string content = client.DownloadString(address);
textBox2.BeginInvoke(new displayDownloadDelegate(displayDownload), content);
}
}
private void displayDownload(string content)
{
textBox2.Text = content;
}
1 ответ
Хотя вы могли бы просто использовать async-await
с помощью асинхронного метода WebClient.DownloadStringTaskAsync, если вам действительно необходимо использовать синхронный метод WebClient.DownloadString (по какой-то причине), выполнив его в отдельном потоке без пользовательского интерфейса, вы все равно можете сделать это довольно просто с помощью Task.Run()
а также async-await
:
private async void button1_Click(object sender, EventArgs e)
{
textBox1.Enabled = false;
string url = textBox1.Text;
using (WebClient client = new WebClient())
{
textBox2.Text = await Task.Run(() => client.DownloadString(url));
}
}