Winforms 在c#windows应用程序中下载数据时,表单控件丢失

Winforms 在c#windows应用程序中下载数据时,表单控件丢失,winforms,c#-3.0,Winforms,C# 3.0,我在c#中创建了一个windows应用程序,从给定的url下载结果。但下载结果是一个漫长的过程,我的windows窗体冻结,我失去了对窗体的控制。在下载数据时,我甚至无法移动或最小化窗体。我在窗体上保留了一个进度条,该进度条已更新,但我无法控制窗体。我在我调用以下载数据的方法上创建了一个子线程,但该线程无法更新进度条。我尝试了,但无法使用后台工作线程(因为它说不允许跨线程通信) 有没有什么方法可以让进度条保持在同一个表单上而不失去对该表单的控制 先谢谢你,先生 如果您使用的是WebClient

我在c#中创建了一个windows应用程序,从给定的url下载结果。但下载结果是一个漫长的过程,我的windows窗体冻结,我失去了对窗体的控制。在下载数据时,我甚至无法移动或最小化窗体。我在窗体上保留了一个进度条,该进度条已更新,但我无法控制窗体。我在我调用以下载数据的方法上创建了一个子线程,但该线程无法更新进度条。我尝试了,但无法使用后台工作线程(因为它说不允许跨线程通信) 有没有什么方法可以让进度条保持在同一个表单上而不失去对该表单的控制


先谢谢你,先生

如果您使用的是
WebClient

webClient.DownloadString(uri)
webClient.DownloadData(uri)
webClient.DownloadFile(uri)

试着用这个代替

webClient.DownloadStringAsync(Uri)
webClient.DownloadDataAsync(Uri)
webClient.DownloadFileAsync(Uri)

异步方法具有一些已完成的事件处理程序,例如下载文件已完成,您可以使用它们来告诉下载何时完成


由于出现“交叉线程操作无效”错误,请阅读。

是否正在构建web应用程序?如果是这样,我建议为进度条使用客户端代码,让服务器处理返回负载的操作——甚至可以使用AJAX返回负载


如果它不是一个web应用程序,我建议在一个单独的线程上剥离其中一个操作。您可以使用类作用域变量将进度传递到进度栏。

+1-我不是一个真正的.NET人-这看起来是我所描述的正确方法-即.NET方法。。。