以下代码在线程池上对方法进行排队。该方法应该引发一些事件,但这些事件没有被提升(或者它们被提升,但是没有在正确的上下文中订阅?)。
请注意,TeamMember
类继承自AsyncFiller
,这是一个实现OnProgressing
和OnComplete
事件的抽象类。
我对此代码无法正常工作并不感到惊讶,但我无法弄清楚如何触发事件。
我搜索了这个网站,谷歌和MSDN以获取有关线程池和事件的信息,但是我们无法将它放在一起。
你能解释为什么这不起作用,以及我做错了什么?
守则
public class TeamMember : AsyncFiller, ITeamMember
{
public string Name { get; private set; }
public string ServiceCardNumber { get; private set; }
public DateTime CurrentDateTime { get; private set; }
public string CurrentStore { get; private set; }
public IWorkDay WorkDay { get; private set; }
public void GetTeamMemberInfoAsync(String serviceCardNumber, DateTime dateWorked, IBusinessLogicFactory businessLogicFactory) {
ThreadPool.QueueUserWorkItem( state => GetTeamMemberInfo(serviceCardNumber, dateWorked, businessLogicFactory));
}
private void GetTeamMemberInfo(String serviceCardNumber, DateTime dateWorked, IBusinessLogicFactory businessLogicFactory)
{
var tmdm = businessLogicFactory.DataAccessFactory.CreateTeamMemberDataManager();
var tmd = tmdm.GetTeamMemberData(serviceCardNumber);
Name = tmd.TeamMemberName;
ServiceCardNumber = serviceCardNumber;
CurrentDateTime = Time.SystemTime.Now();
CurrentStore = tmd.CurrentStore;
OnProgressing(new ReportingProgressEventArgs("Team member information is complete."));
OnComplete(new TeamMemberCompleteEventArgs(this));
}
}
失败测试的样本 (进度和完成事件序数都为零,这告诉我事件没有被提出,或者没有在正确的上下文中订阅)
[TestFixture]
public class TeamMemberSpecs
{
[SetUp]
public void TestSetup() {
AuditEngine.Time.SystemTime.ResetDateTime();
}
[Test]
public void GetTeamMemberInfoAsync_UponCompletion_RaisesProgressThenCompleteEvent() {
var blf = Substitute.For<IBusinessLogicFactory>();
var serviceCardNumber = "12345";
var dateWorked = new DateTime(2014, 10, 24);
var tm = new TeamMember();
var eventOrder = 0;
var progressEventOrdinal = 0;
var completionEventOrdinal = 0;
tm.ReportingProgress += (o, e) => progressEventOrdinal = ++eventOrder;
tm.Complete += (o, e) => completionEventOrdinal = ++eventOrder;
tm.GetTeamMemberInfoAsync(serviceCardNumber,dateWorked,blf);
Assert.AreEqual(1,progressEventOrdinal,"Progress event order was incorrect.");
Assert.AreEqual(2,completionEventOrdinal,"Completion event order was incorrect.");
}
}