3

我正在尝试使用 SelectionRange S 作为传入参数调用 buildRangedJobCache,但是编译器(visual studio 2010)给出了错误:Method Name Expected下面是给出问题的调用:

    private void retrieveSeveralDaysJobs(SelectionRange S)
    {
        ignoreUpdates = false;
        this.SetStatus(DataLogUIStrings.strRetrievingJobInformation);
        Thread buildIndexThread = new Thread(new ThreadStart(buildRangedJobCache(S)));
        buildIndexThread.Priority = ThreadPriority.Lowest;
        buildIndexThread.Start();
    }

这是函数 buildRangedJobCache(SelectionRange S):

    private void buildRangedJobCache(SelectionRange S)
    {
        this.Cursor = Cursors.AppStarting;
        try
        {                
            if (DataStore == null)
            { throw new Exception("Error: DataStore is null, Unable to retrieve jobs."); }
            lock (((ICollection)jobs).SyncRoot)
            {
                for (DateTime Day = S.Start; Day <= S.End; Day.AddDays(1))
                {
                    this.RangeJobs.AddRange(DataStore.GetJobsListForDay(JobDateToDisplay.GetValueOrDefault(DateTime.Today)));
                }
            }
            this.SetStatus(string.Format(DataLogUIStrings.strRetrievedSummaryInformation, this.jobs.Count));
        }
        catch (Exception e)
        {
            Log.Write(e);
        }
        this.Cursor = Cursors.Default;
    }

我也链接到这里:Delegate: Method name expected error 因为这个解决方案对我不起作用。

**更新:显然还不清楚,解决方案:

Thread buildIndexThread = new Thread(new ThreadStart(buildRangedJobCache));

做同样的问题。

4

2 回答 2

1

创建委托时仅传递方法名称:

Thread buildIndexThread = new Thread(new ThreadStart(buildRangedJobCache));

ThreadStart委托也不应该接收任何参数。它被定义为

 public delegate void ThreadStart();

因此,您的方法签名与委托签名buildRangedJobCache不匹配。ThreadStart如果你想将一些参数传递给线程,你应该使用ParameterizedThreadStart委托,它接受类型参数object

private void retrieveSeveralDaysJobs(SelectionRange range)
{
    ignoreUpdates = false;
    this.SetStatus(DataLogUIStrings.strRetrievingJobInformation);
    // pass ParameterizedThreadStart delegate
    Thread buildIndexThread = new Thread(BuildRangedJobCache);
    buildIndexThread.Priority = ThreadPriority.Lowest;
    buildIndexThread.Start(range); // provide parameter for thread
}

private void BuildRangedJobCache(Object obj)
{
    SelectionRange range = (SelectionRange)obj; // cast to your type
    // code
}
于 2013-06-19T15:40:42.230 回答
1

构造Thread函数需要一个委托(ThreadStart或者ParametrizedThreadStart)。您正在尝试创建ThreadStart委托,但您可以从方法创建委托,而不是方法调用表达式。

因此,如果您的方法没有参数,则以下方法将起作用:

new Thread(new ThreadStart(buildRangedJobCache));

也会如此(因为编译器可以推断您正在创建哪个委托):

new Thread(buildRangedJobCache);

如果您需要将参数传递给您的方法,您可以使用ParametrizedThreadStart并且其重载Start()需要一个参数。但这意味着您必须将方法更改为具有object参数并将其转换为方法内的类型。

我认为更好的选择是使用 lambda:

new Thread(() => buildRangedJobCache(S));

这将创建一个匹配ThreadStart并记住变量的匿名方法S。这样,您不需要方法的签名,也不需要任何强制转换。

于 2013-06-19T19:02:14.783 回答