为什么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不喜欢它。
当你调用BeginInvoke
时,你是在Delegate
的特定的子类上调用它。当您调用EndInvoke
时,您试图在System.Delegate
本身上调用它,这将不起作用。每个子类声明自己的Invoke
/BeginInvoke
/EndInvoke
方法集——它必须这样做,因为方法的签名根据您正在谈论的确切委托类型的签名而变化。如果你看一下System.Delegate
的文档,你不会在那里找到任何这些方法。
你的代码想要实现什么并不清楚,但是如果你想调用EndInvoke
,你需要让Job.Delegate
成为一个特定的委托类型。
因为Delegate
上不存在EndInvoke
。相反,您应该让Job类保存对BackupDelegate
的引用。