Right, this is my first venture into multi threading so could be something incredibly simple I’m missing but here goes…
I’m using thread pool to kick off a bunch of short running processes at the same time, each will be passed a URL to process/scrape for fb-tweets-google-plusones and return a result to my ReportProgress method by invoking the delegate ThreadDone but when passing in the processed object once the thread’s done processing, i keep getting the error Method name expected but I’m passing in the method ReportProgress? I’m willing to bet (hoping) it’s something incredibly simple that someone more experienced can spot right away. Here is what i have so far:
Delegate definition:
public delegate void ThreadDone(object sender, ScrapeResult scrapedResult);
DoWork:
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);
}
}
ReportProgress:
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);
}
Any help is greatly appreciated!
Change this:
To:
The first parameter of
Invoke()is the delegate, to build a delegate you do not need to give its parameters but only the method to call (that’s why compiler says “method name expected”) Withnew ThreadDone(ReportProgress)you create the new delegate and with 2nd and 3rd parameter ofInvoke()you specify the parameters that will be passed to your delegate.