我在c#vs 2010 .net 4.0中创建了应用程序。它从gmail获取RSS源,然后在一张简单的表格中显示它们。但是,当我使用计时器从40秒时间检查字符串rss中的更新时,问题就开始了。该程序工作正常,但它变成无响应我不能点击一个按钮或任何东西。我需要帮助。 注意任务启动后,我的应用程序必须运行。C#应用程序在循环运行时不具有交互性
0
A
回答
0
后台工作者或异步Web客户端是要走的路。我只想补充一点,当我上次使用webclient时,我发现了一些奇怪的行为。每次从Web客户端对象进行的第一个调用将导致大约30-40秒的等待,直到数据被检索。随后的呼叫会更快。它最终成为与webclients默认代理设置有关的事情,将代理设置为null将消除等待。
将代理设置为空可能不是最好的解决方案,只是提及它以防止它导致您找到更好的解决方案。
6
是的。您的应用程序正在UI线程上工作,而不与Windows事件循环交互。您需要在后台线程上完成您的工作(可能使用BackgroundWorker)。
这里是一个WinForms的applcation使用BackgroundWorker的一个非常简单的例子(但是做检查连接到上面的类文件):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
}
// update UI back on main thread
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
listBox1.Items.AddRange(content.ToArray());
}
List<string> content;
// do work on background thread
void bw_DoWork(object sender, DoWorkEventArgs e)
{
content = new List<string>();
// simulate slow update
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(10);
content.Add(i.ToString());
}
}
}
-2
在循环中,写了下面这行的任何地方
Application.DoEvents()
1
我会研究异步方法下载像WebClient.DownloadStringAsync
0
请勿为此使用后台线程。异步!=新线程。如果您使用新线程来执行同步Web请求,您将(非常快)扼杀线程池(假设您正在使用后台工作人员)。
单个线程可以管理数百个异步Web请求,但同时只有一个同步请求。
如果您是初学者,我强烈建议您遵循CodeInChaos的建议并使用WebClient。 WebClient的优势在于它为您处理所有异步管道。缺点是,因为它为你做了一切,你失去了对webrequest的很多控制(即不能修改http头等),它也在UI线程上返回结果(在你的情况下,这实际上是一个积极的事情)。
var webUri = new Uri("www.website.com");
var webClient = new WebClient();
webClient.DownloadDataCompleted += DownloadDataCallback;
webClient.DownloadStringAsync(webUri, null);
private void DownloadDataCallback (Object sender, DownloadDataCompletedEventArgs e)
{
var webRequestResult = e.Result;
}
相关问题
- 1. 在C运行时与应用程序交互
- 2. 在C运行时与命令行程序交互(stdin/out)C
- 3. MFMailComposeViewController不具有交互性
- 4. List.Contains在通过foreach循环进行交互时不起作用
- 5. 正在运行for循环时退出应用程序
- 6. 事件处理程序循环相交流运行循环
- 7. C#控制台应用程序,无法让程序在while循环中运行
- 8. 如何在MFC应用程序中交互式运行Flash?
- 9. 在运行时与nodejs应用程序中的python脚本进行交互
- 10. 如何在烧瓶应用程序运行时与它们进行交互?
- 11. 从java运行交互式命令行应用程序
- 12. 不同循环的C++运行时间
- 13. 在C中与外部应用程序进行交互#
- 14. C#列出正在运行的具有GUI的应用程序
- 15. 在Arduino上运行程序时连续运行循环?
- 16. javax.ejb.EJBException在运行具有GLassfish的Java EE(JPA)应用程序时
- 17. 在特定时间运行C++循环
- 18. MPAndroidChart在运行时的用户交互
- 19. 从java运行交互式Dos程序
- 20. 如何阻止WPF应用程序非交互式运行?
- 21. 全局应用程序上下文/环境运行时属性
- 22. RxJS在CLI应用程序中的可观察和交互循环
- 23. 交互式电影应用程序的可行性
- 24. 与其他循环的循环交互
- 25. 当不在应用程序中时关闭鼠标交互
- 26. 针对Grails运行时环境交互式运行代码
- 27. 在Android上的线程中运行无限循环时,应用程序崩溃。
- 28. 程序停留在while循环但不运行程序?
- 29. 在while循环中运行Qt程序
- 30. while循环在程序运行
**错误的答案**在代码中抛出对DoEvents的调用而不理解它们做什么*仅仅是为了隐藏重入错误而乞求。几乎总是有一个更好的解决方案。 (在这种情况下,`BackgroundWorker`就是这样。) – 2011-02-13 10:00:39
嗯那个The Dowoker工作得有点小,但生病了,连whith cody gray .. – user614946 2011-02-14 03:25:53