0

是的,这是我第一次尝试多线程,所以可能是我想念的非常简单的事情,但是这里......

我正在使用线程池同时启动一堆短时间运行的进程,每个进程都将传递一个 URL 以处理/抓取 fb-tweets-google-plusones 并ReportProgress通过调用委托将结果返回给我的方法,ThreadDone但是当线程完成处理后传入已处理的对象时,我不断收到错误Method name expected但我正在传入方法ReportProgress?我愿意打赌(希望)这是一件非常简单的事情,更有经验的人可以立即发现。这是我到目前为止所拥有的:

委托定义:

public delegate void ThreadDone(object sender, ScrapeResult scrapedResult);

做工作:

public void DoWork(object sender)
{
      while (true)
      {
          //lock the thread to prevent other threads from processing same job
          lock (_threadLock)
          {   
              string url = (string)sender;
              result.URL = url;

              if (chkFb.Checked)
              {
                  result.Shares = grabber.GetFacebookShares(url);
              }
              if (chkTwitt.Checked)
              {
                  result.Tweets = grabber.GetTweetCount(url);
              }
              if (chkPlusOne.Checked)
              {
                  result.PlusOnes = grabber.GetPlusOnes(url);
              }

              this.Invoke(new ThreadDone(ReportProgress(sender, result))); //ERROR is on this line
           }
           Thread.Sleep(100);
        }
}

报告进度:

private void ReportProgress(object sender, ScrapeResult scrapedResult)//<-- might not need?
{
     progressBar.Value++;
     ScrapeResult result = (ScrapeResult)sender;//ScrapedResult result = scrapedResult;
     outputGrid.Rows.Add(result.URL, result.Shares, result.Tweets, result.PlusOnes);
     outputGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
     outputGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.DisplayedCells);
}

任何帮助是极大的赞赏!

4

2 回答 2

3

改变这个:

this.Invoke(new ThreadDone(ReportProgress(sender, result)));

至:

this.Invoke(new ThreadDone(ReportProgress), sender, result);

的第一个参数Invoke()是委托,要构建委托,您不需要提供其参数,而只需提供要调用的方法(这就是编译器说“预期方法名称”的原因)随着new ThreadDone(ReportProgress)您创建新委托并使用第二个和第三个参数Invoke()您指定将传递给您的委托的参数。

于 2012-07-06T08:59:06.467 回答
2

我会认真考虑使用TPL。更清洁地处理任务的完成。

于 2012-07-06T09:01:48.193 回答