C# 正在从线程池中的方法引发事件
以下代码将线程池上的方法排队。该方法应该引发几个事件,但这些事件没有被引发(或者它们正在被引发,但没有在正确的上下文中被订阅?) 请注意,C# 正在从线程池中的方法引发事件,c#,events,threadpool,C#,Events,Threadpool,以下代码将线程池上的方法排队。该方法应该引发几个事件,但这些事件没有被引发(或者它们正在被引发,但没有在正确的上下文中被订阅?) 请注意,TeamMember类继承自AsyncFiller,这是一个抽象类,其中实现了OnProgressing和OnComplete事件 我对这段代码不起作用并不感到惊讶,但我不太明白如何触发事件 我在这个网站、谷歌和MSDN上搜索了关于线程池和事件的信息,但就是没能在脑海中把它们放在一起 你能解释一下为什么这不起作用,我做错了什么吗 代码 public class
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));
}
}
失败测试的样本
(progress和completion事件序号均为零,这表明事件未引发,或者未在正确的上下文中订阅)
[TestFixture]
公共类TeamMemberSpecs
{
[设置]
公共void TestSetup(){
AuditEngine.Time.SystemTime.ResetDateTime();
}
[测试]
public void GetTeamMemberInfoAsync\u UponCompletion\u raisesprressthenpleteevent(){
var blf=替换为();
var serviceCardNumber=“12345”;
var dateWorked=新日期时间(2014年10月24日);
var tm=新的团队成员();
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);
AreEqual(1,progressEventOrdinal,“进度事件顺序不正确”);
AreEqual(2,completionEventOrdinal,“完成事件顺序不正确”);
}
}
试图断言事件处理程序是否在可能运行之前运行,这是行不通的。始终避免火灾,忘记线程。澄清一下,你是说我的代码可能正在工作,但我的测试方法可能是问题所在?我明白了,这是有道理的。你对我如何重组测试以避免这个问题有什么建议吗?完全公开,我不太熟悉你所说的“开火并忘记”(无论如何,在这个上下文中不是这样)
[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.");
}
}