Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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#_.net_Windows_Process - Fatal编程技术网

C# 启动执行委托的新进程

C# 启动执行委托的新进程,c#,.net,windows,process,C#,.net,Windows,Process,在.NET中,是否可以在子进程中执行方法(委托、静态方法等)System.Diagnostics.Process似乎需要实际的文件名,这意味着需要一个单独的可执行文件 我试图做的是在单元测试中验证一个OS资源是否在进程退出时被清理。我知道可以使用CodeDOM或IL生成来创建这样的程序集并执行它,但单元测试的全部目的是隔离组件部分,而不是创建复杂性。出于同样的原因,我希望完全避免单独组装 理想情况下,我会这样做: public static void CreateCounter() {

在.NET中,是否可以在子进程中执行方法(委托、静态方法等)
System.Diagnostics.Process
似乎需要实际的文件名,这意味着需要一个单独的可执行文件

我试图做的是在单元测试中验证一个OS资源是否在进程退出时被清理。我知道可以使用CodeDOM或IL生成来创建这样的程序集并执行它,但单元测试的全部目的是隔离组件部分,而不是创建复杂性。出于同样的原因,我希望完全避免单独组装

理想情况下,我会这样做:

public static void CreateCounter()
{
    var counter = new PerformanceCounter("category", "counter", "instance");
    counter.InstanceLifetime = PerformanceCounterInstanceLifetime.Process;
}

[Test]
public void TestResourceDisposal()
{
    // Start child process to execute CreateCounter()
    ...
    // verify the resource is disposed
}

首先,不,没有办法。I进程意味着一个.exe。这不是Unix,您可以在其中派生一个作为父进程副本的进程


我只需要创建一个小的.exe来运行。是否需要使用不同的性能计数器运行测试?如果它与其中一个一起工作,那么它肯定会与它们中的任何一个一起工作?

我不确定您到底想实现什么,但是从CreateCounter返回性能计数器实例并使用using指令是否更容易,因为PerformanceCounter是IDisposable的。像这样:

using (var counter = CreateCounter())
{
     // Do some work
}
然后计数器将始终被清理,即使您在测试过程中抛出


否则,我想你想要的是。然后可以使用thread.Join()等待线程完成。有关更多信息,请参阅。

您所说的不是单元测试。与实际的(昂贵的)操作系统服务交互违反了单元测试要争取的基本隔离原则

如果您打算以更端到端的方式测试代码,实际与性能计数器交互等等,那么这将是一个集成测试,应该以更“繁重”的方式编写,即在需要时编写一个单独的EXE,运行任何复杂的设置或清理步骤,等等

如果需要对处理性能计数器的组件进行单元测试,则必须首先抽象掉此依赖关系。通常,您会创建一个表示性能计数器表面积的基类或接口,然后创建某种类型的类来在(测试)运行时替换其功能。实际系统将使用一个简单的包装器,该包装器将委托给实际的性能计数器,并将通过如上所述的集成测试来执行


通过阅读上面的评论,听起来您似乎在尝试测试.NET框架的保证。我怀疑这是否真的是必要的,因为它已经经过了很好的测试,尽管您可能希望测试代码是否正确地使用它(在这种情况下,您可以根据所寻求的验证进行单元测试或集成测试)。

不幸的是,调用Dispose()或生成线程都不够。我正在专门测试perf counter实例名称的发布(由Windows),它被指定为仅在进程退出时发生-线程连接不会产生预期的效果,也不会进行Dispose()。请注意最后一段:是和否。我实际上是在测试我们自己的计数器包装器;通常一个模拟就足够了,但在这种情况下就没有那么多了。根据我的经验,性能计数器有一段闲逛的历史,并不总是按照它们应该的方式工作;测试(以任何名称)应该在这种行为发生时隔离它。因此,您似乎是对的——我找不到一种管理方式来做到这一点。我已经使用了CodeDOM路径,正在生成tiny.exe。谢谢