我正在创建一个监视 ftp 日志的 win 服务,当文件上传后,我想启动一个外部应用程序,如 powershell 脚本,对文件进行处理。我的问题是我想在执行此操作时将其转入另一个线程,还是应该等到它完成后再继续。
这个过程已经在一个线程中(该服务将监视多个服务器),线程启动线程的想法让我担心。这是要担心的事情,还是我帽子里的锡纸太多了。
我正在创建一个监视 ftp 日志的 win 服务,当文件上传后,我想启动一个外部应用程序,如 powershell 脚本,对文件进行处理。我的问题是我想在执行此操作时将其转入另一个线程,还是应该等到它完成后再继续。
这个过程已经在一个线程中(该服务将监视多个服务器),线程启动线程的想法让我担心。这是要担心的事情,还是我帽子里的锡纸太多了。
好吧,以模块化方式对其进行编码,而不必担心线程。如果在未来,您发现您的应用程序将受益于多线程方法,那么请解决它。如果您已正交构建组件,则螺纹部分将更自然地适合。
在应用程序的一开始就解决线程问题对我来说总是过早的优化。先构建组件,然后再考虑如何线程化它们。
[编辑] 我绝不建议你不要考虑线程。每个组件都需要构建有可能被多个线程使用 - 这是所有应用程序中的一种防御性和智能实践。我的意思是不要太担心应用程序将如何处理线程以及如何首先设置应用程序的线程管理。
我认为更重要的问题是你从产生另一个线程中得到什么?如果您不需要让代码并行执行,请不要这样做。如果你这样做,应该没有问题。如果您关心子线程创建自己的线程,则将线程创建委托给ThreadPool
.
首要问题:你需要知道这个过程的结果吗?如果你能开枪就忘记,那就这样做——这更容易。如果你需要结果,那就等着吧。
另外,您是否考虑过使用 FileSystemWatcher?它可以远程工作。
虽然有点离题,但由于您提到您将启动一个 powershell 脚本,我想指出通过 powershell“运行空间”在进程内运行脚本的选项。这是一个最小的例子:
using System.Management.Automation;
static class PoshExec
{
static void Exec(string scriptFilePath)
{
(new RunspaceInvoke()).Invoke("& " + scriptFilePath);
}
}
添加对 c:\Program Files\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0\System.Management.Automation.dll 的引用