Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在从线程池中的方法引发事件_C#_Events_Threadpool - Fatal编程技术网

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.");
    }
}