为什么Visual Studio 2010告诉我"'System.Delegate'不包含&#

本文关键字:System 包含 Delegate quot Visual Studio 2010 告诉我 为什么 | 更新日期: 2023-09-27 18:17:38

为什么Visual Studio 2010告诉我" System. net . net " ?委托'不包含'EndInvoke'的定义"当我调用job.Delegate.EndInvoke() ?我怎么修理它?请注意,它喜欢BeginInvoke()很好,如果我在BeginInvoke()之后立即添加EndInvoke()(尽管这不能实现我想要的),它不会抱怨。

我有一个小的JobTracker类来跟踪备份作业:

public class JobTracker 
{
    private class Job
    {
        public Account Account { get; set; }
        public IAsyncResult Result { get; set; }
        public Delegate Delegate { get; set; }
        public bool IsCompleted { get { return result.IsCompleted } }
        public string Instance { get { return Account.Instance } }
    }
    public List<Job> Running = new List<Job>;
    public void AddJob(Account a, IAsyncResult result, Delegate del)
    {
        var j = new Job { Account = a, Result = result, Delegate = del };
        Running.Add(j);
    }
    public void RemoveJob(Job job)
    {
        Running.Remove(job);
    }
public bool IsInstanceRunning(string instance)
{
    return (Running.Count(x => x.Instance == instance) > 0);
}
}

这些备份任务将通过BeginInvoke()/EndInvoke()异步发生。调用代码(简化)看起来像这样:

public void BackupAccounts(IEnumerable<Account> accounts, int maxconcurrent = 4)
{
    // local copy
    List<Accounts> myaccounts = accounts.ToList();
    var jobs  = new JobTracker();
    while (myaccounts.Count > 0) 
    {
        // check our running jobs
        foreach (var job in jobs.Running)
        {
            if (job.IsCompleted)
            {
// PROBLEM LINE:
                job.Delegate.EndInvoke();
                jobs.RemoveJob(job);
            }
        }
        // more jobs!
        while (jobs.Count < maxconcurrent)
        {
            int i = 0;
            Account account = null;
            // choose the next account on a free instance
            while (int < accounts.Count)
            {
                account = accounts[i];
                // instance in use?
                if (jobs.InstanceIsRunning(account.Instance))
                {
                    i += 1;
                    continue;
                }
                else
                {
                    // start the job
                    accounts.RemoveAt(i);
                    BackupDelegate del = new BackupDelegate(BackupAccount, account);
                    IAsyncResult result = del.BeginInvoke();
                    jobs.AddJob(account, result, del);
                }
            }
        }
        // we're all full up, give it some time to work
        Thread.Sleep(2000);
    }
}

PS -我知道这段代码可以大大简化。这是第一次尝试——我只是不明白为什么VS不喜欢它。

为什么Visual Studio 2010告诉我"'System.Delegate'不包含&#

当你调用BeginInvoke时,你是在Delegate特定的子类上调用它。当您调用EndInvoke时,您试图在System.Delegate本身上调用它,这将不起作用。每个子类声明自己的Invoke/BeginInvoke/EndInvoke方法集——它必须这样做,因为方法的签名根据您正在谈论的确切委托类型的签名而变化。如果你看一下System.Delegate的文档,你不会在那里找到任何这些方法。

你的代码想要实现什么并不清楚,但是如果你想调用EndInvoke,你需要让Job.Delegate成为一个特定的委托类型。

因为Delegate上不存在EndInvoke。相反,您应该让Job类保存对BackupDelegate的引用。