2013-02-02 49 views
0

请参见下面的代码:使用线程调用代码多线程时间?

foreach(string url in urls) 
{ 
    //Method that will process url ProcessUrl(url) 
    //Add eached proccessed url to a treelist 
} 

ProcessUrl方法有HttpWebRequest和HttpWebResponse所以有时它需要轻推,如果有许多环节需要时间,这将挂我的程序。

我实际上并不建议一个想法的解决方案,因为我可能基于它的错误,所以我想要的是使代码运行,而我可以在我的程序中100%运行没有任何崩溃或挂起,并且每个新处理的链接都将插入到没有任何延迟的treelist中。

+0

你使用了什么“treelist”?你看到什么问题?你在“treelist”中插入的当前代码是什么样的? – Tawnos

回答

2

如果您想在后台执行长时间运行的操作并将操作结果传回到UI,因为这些操作的结果可用,同时UI保持响应,那么可以直接在此处使用BackgroundWorker

void BeginExpensiveOperation() 
    { 
     var worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += ExpensiveWork; 
     worker.ProgressChanged += WorkerOnProgressChanged; 

     List<string> urls = new List<string> { "http://google.com" }; 
     worker.RunWorkerAsync(urls); 
    } 

    // runs in a worker thread 
    void ExpensiveWork(object sender, DoWorkEventArgs e) 
    { 
     var worker = (BackgroundWorker)sender; 
     var urls = (List<string>) e.Argument; 
     foreach (var url in urls) 
     { 
      //TODO: do your work here synchronously 
      var result = new WebClient().DownloadString(url); 

      //TODO: pass the result in the userState argumetn of ReportProgress 
      worker.ReportProgress(0, result); // will raise worker.ProgressChanged on the UI thread 
     } 
    } 

    private void WorkerOnProgressChanged(object sender, ProgressChangedEventArgs progressChangedEventArgs) 
    { 
     //this executes on the UI thread 
     var value = progressChangedEventArgs.UserState; 
     //TODO: use result of computation to add it to the UI 
     panel.Children.Add(new TextBlock {Text = value.ToString()}); 
    } 

填写在//TODO:占位符您的特定问题的代码,并呼吁BeginExpensiveOperation()异步开始操作。