C# 多线程委托问题,需要方法名称吗?

C# 多线程委托问题,需要方法名称吗?,c#,winforms,multithreading,delegates,threadpool,C#,Winforms,Multithreading,Delegates,Threadpool,是的,这是我第一次尝试多线程,所以可能是我所缺少的非常简单的东西,但接下来 我正在使用线程池同时启动一系列短时间运行的进程,每个进程都将被传递一个URL来处理/刮取fb tweets google plusones,并通过调用委托ThreadDone将结果返回给我的ReportProgress方法,但当线程完成处理后传入已处理对象时,我不断得到错误方法名,但我正在传入方法ReportProgress?我愿意打赌(希望)这是一件非常简单的事情,更有经验的人可以马上发现。以下是我到目前为止的情况:

是的,这是我第一次尝试多线程,所以可能是我所缺少的非常简单的东西,但接下来

我正在使用线程池同时启动一系列短时间运行的进程,每个进程都将被传递一个URL来处理/刮取fb tweets google plusones,并通过调用委托
ThreadDone
将结果返回给我的
ReportProgress
方法,但当线程完成处理后传入已处理对象时,我不断得到错误
方法名,但我正在传入方法
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);
}
private void ReportProgress(对象发送方,scrapresult scrapdresult)//更改此项:

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

Invoke()
的第一个参数是委托,要构建委托,您不需要给出它的参数,只需要使用
newthreaddone(ReportProgress)
创建新委托,并使用
Invoke()的第二个和第三个参数调用方法(这就是为什么编译器说“预期的方法名”)
指定将传递给代理的参数。

更改此选项:

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


Invoke()
的第一个参数是委托,要构建委托,您不需要给出它的参数,只需要使用
newthreaddone(ReportProgress)
创建新委托,并使用
Invoke()的第二个和第三个参数调用方法(这就是为什么编译器说“预期的方法名”)< /代码>指定要传递给委托人的参数。

< P>我会认真考虑使用。处理任务的完成要干净得多。

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

知道这将是一件简单的事情。谢谢@Adriano。我知道事情会很简单。谢谢@Adriano。我愿意接受建议!我有一个以前版本的应用程序,它使用后台工作程序逐个处理URL,但一位朋友推荐ThreadPool作为更好的选择。它比TP有什么好处?如果您手动启动和处理线程,那么在当前线程结束时启动另一个线程/操作就相当麻烦了。使用TPL,您可以将任务链接在一起,您可以在任务完成后启动操作(或新任务),等等。啊,我明白了,我现在就来研究它。您对使用
Thread
而不是
ThreadPool
有何想法?ThreadPool而不是Thread。如果可能,不要自己创建线程,因为它们很昂贵。线程池创建自己的线程,并在可以的时候重用它们。TPL看起来是更好的解决方案。很酷,你可以一个接一个地链接任务。用它取消/完成任务要比我目前使用的
联锁的实现好得多。从工作计数器中减量
到-1。我愿意接受建议!我有一个以前版本的应用程序,它使用后台工作程序逐个处理URL,但一位朋友推荐ThreadPool作为更好的选择。它比TP有什么好处?如果您手动启动和处理线程,那么在当前线程结束时启动另一个线程/操作就相当麻烦了。使用TPL,您可以将任务链接在一起,您可以在任务完成后启动操作(或新任务),等等。啊,我明白了,我现在就来研究它。您对使用
Thread
而不是
ThreadPool
有何想法?ThreadPool而不是Thread。如果可能,不要自己创建线程,因为它们很昂贵。线程池创建自己的线程,并在可以的时候重用它们。TPL看起来是更好的解决方案。很酷,你可以一个接一个地链接任务。用它取消/完成任务要比我当前使用工作计数器lol中的
Interlocked.decreation
to-1实现要好得多