C#:“没有回复”程序进行一些后台处理时的窗口

在我的C#项目中,我有一个显示进度条的表单。 然后进行一些处理,其涉及通过因特网进行通信。 当这个处理发生时,表格在Win 7中运行时显示
"Not Responding"
,在XP中,表单只是白色。 无论哪种方式,都是不可接受的。 我是否需要使用线程来解决这个问题? 在这种情况下我需要使用哪些线程的基础知识?     
已邀请:
您的处理必须在一个线程内完成。 在您的主题之外,您必须调用进度条以显示进度。
progressBar1.Invoke((MethodInvoker)delegate
{
progressBar1.Value = (int)((i / limit) * 100);
});
    
是的,你必须使用线程来保持你的UI响应,而在后台完成一些事情。但是这个问题不能像“使用线程来解决它”那样回答,因为有很多形式可以使用线程。 (Backgroundworker,Threadpool,Asynch IO,创建线程,任务并行库,CCR,以及您可以想象的各种并行化方案)。 正如你所说,你正在做一些需要连接到互联网的处理。花费最多的时间在哪里?是不是网络上的IO占用了大部分时间,因为异步IO很有意义。如果花费的时间是在一个巨大的处理操作中,那么后台工作者是完美的,但是如果这个处理可以进一步细分为更小的并行处理任务块,则优选TPL或ThreadPool。到目前为止,我只谈论在Windows窗体事件中发生的一些处理,并保持UI响应。但根据该场景,您可以使用许多其他选项来使线程为您工作。 Asynch IO看起来不像你在做线程,但它更适合winforms的事件模型。如果您对基于事件的编程非常满意,那么您可以看一下。 Threadpool看起来更像是一个工作队列,您可以继续完成所有工作需要完成的工作,框架根据您使用的机器类型(双核,四核等)计算出运行的线程数量。它会以最佳方式让你的工作项目得以实现。 最重要的是它不是一个使用一个而不是其他的答案,而是基于您正在解决的问题类型需要决定线程模型。     
更便宜的选择是在应用程序运行的任何循环中添加Application.DoEvents()行,这将导致它在每次到达时处理消息。     
如果使用
System.Net.WebClient
,则可以使用
DownloadDataAsync()
以非阻塞方式进行通信。
System.Net.Sockets.Socket
类也提供非阻塞通信。 套接字示例 WebClient示例     
是的,更好的方法是使用BackGroundWorker组件。它是线程的包装器,因此您不需要管理线程。您可以从MSDN上的后台工作者获取更多信息     
只要程序保留在处理内容的功能中,UI就不会更新。这就是为什么您可能需要启动后台线程,以便您的UI可以在后台线程可以完成工作时继续运行。另一种方法是使用异步功能。 背景线程的例子     
根据您的描述,我假设您的所有工作当前都在一个线程上完成,主线程也用于您的GUI。 进度条只能在主线程有机会检查其状态并应用任何预期更改时更新。 因此,重要的是您的处理工作不会长时间占用主线程。 处理此问题有两种主要方法: 踩踏处理活动。 将处理步骤分解为许多连续任务 - 每个任务都很短。 逐步调用主线程上的OnIdle事件中的每个串行任务。 使用后台线程。 请参阅其他答案,详细说明这将如何工作。 如果您想避免线程同步的细节,那么步进方法会很有用。线程方法可能更好,但只有在无法保证串行短步的情况下才是必要的。     

要回复问题请先登录注册