2011-02-13 15 views
0

我在c#vs 2010 .net 4.0中创建了应用程序。它从gmail获取RSS源,然后在一张简单的表格中显示它们。但是,当我使用计时器从40秒时间检查字符串rss中的更新时,问题就开始了。该程序工作正常,但它变成无响应我不能点击一个按钮或任何东西。我需要帮助。 注意任务启动后,我的应用程序必须运行。C#应用程序在循环运行时不具有交互性

回答

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() 
+4

**错误的答案**在代码中抛出对DoEvents的调用而不理解它们做什么*仅仅是为了隐藏重入错误而乞求。几乎总是有一个更好的解决方案。 (在这种情况下,`BackgroundWorker`就是这样。) – 2011-02-13 10:00:39

+0

嗯那个The Dowoker工作得有点小,但生病了,连whith cody gray .. – user614946 2011-02-14 03:25:53

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; 
} 
相关问题