从线程池中的方法引发事件

时间:2014-11-19 21:19:12

标签: c# events threadpool

以下代码在线程池上对方法进行排队。该方法应该引发一些事件,但这些事件没有被提升(或者它们被提升,但是没有在正确的上下文中订阅?)。

请注意,TeamMember类继承自AsyncFiller,这是一个实现OnProgressingOnComplete事件的抽象类。

我对此代码无法正常工作并不感到惊讶,但我无法弄清楚如何触发事件。

我搜索了这个网站,谷歌和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.");
    }
}

0 个答案:

没有答案