【问题标题】:Multi threading delegate issue, Method name expected?多线程委托问题,需要方法名称吗?
【发布时间】:2012-07-06 08:56:09
【问题描述】:

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

我正在使用线程池同时启动一堆短时间运行的进程,每个进程都会被传递一个 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);
}

非常感谢任何帮助!

【问题讨论】:

    标签: c# winforms multithreading delegates threadpool


    【解决方案1】:

    改变这个:

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

    收件人:

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

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

    【讨论】:

    • 知道这将是一件简单的事情。谢谢@Adriano。
    【解决方案2】:

    我会认真考虑使用TPL。完成任务时要干净得多。

    【讨论】:

    • 我愿意接受建议!我有一个以前版本的应用程序,它使用后台工作人员逐个处理 URL,但一位朋友推荐 ThreadPool 作为更好的选择。它何时提供超过 TP 的好处?
    • 如果您手动启动和处理线程,那么在当前完成时启动另一个线程/动作非常繁琐。使用 TPL,您可以将任务链接在一起,一旦任务完成,您就可以开始一个动作(或新任务),等等。
    • 啊,我明白了,我现在就调查一下。您对使用Thread 而非ThreadPool 有何看法?
    • 线程池上的线程。如果可能,不要自己创建线程,它们很昂贵。 ThreadPool 创建自己的线程,并尽可能重用它们。
    • TPL 看起来是更好的解决方案。非常酷,您可以将任务一个接一个地链接起来。用它取消/完成任务会比我目前使用Interlocked.Decrement 的实现要好得多,从工作柜台到 -1 哈哈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多