【问题标题】:Console application is executed by multiple windows task schedulers at the same time控制台应用由多个windows任务调度器同时执行
【发布时间】:2014-02-23 02:20:58
【问题描述】:

我正在编写一个 C# 控制台应用程序,它调用 Web 服务从数据库中提取大量数据(耗时的过程),Windows 任务调度程序将在预定时间执行此控制台应用程序。现在,将创建许多任务调度程序(例如至少 70 个任务调度程序)来同时执行同一个 exe。设计此类应用程序的最佳方法是什么,以便在一个任务调度程序正在执行而另一个任务调度程序试图同时执行同一个 exe 时,该 exe 不会被中断?

下面给出一个示例程序

class Program
{
    static void Main(string[] args)
    {
        var countryCode = "34";
        WebServiceClient client = new WebServiceClient(); //ASP.NET web service
        var output = client.Process(countryCode);//this is a time consuming process and takes 5 minutes or more
        File.WriteAllText("c:\\test\\country.txt", output);
    }              
}

【问题讨论】:

  • 使用全局互斥锁:stackoverflow.com/questions/229565/…
  • 与论坛网站不同,我们不使用“谢谢”、“感谢任何帮助”或Stack Overflow 上的签名。请参阅“Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?.
  • 如果您不想执行多个并发执行,为什么要创建多个同时执行它的计划?您似乎在说,“我有一个系统设置为执行 X,但我不希望它执行 X。我该如何阻止它?”我不清楚你想要的行为是什么。
  • @Jim - 如您所见,国家代码(即 34)在那里是硬编码的,但实际上这将作为一个参数出现。所以每个调度程序将使用不同的国家代码,我要求最佳设计方法是专家意见,我们在团队内部确实有自己的意见,但我们正在考虑所有可能的解决方案,并将选择最适合我们的解决方案。希望这会有所帮助。
  • 我不知道为什么我的问题显示为-1,为什么我的声誉分数下降了?应该鼓励人们提出问题

标签: c# multithreading parallel-processing console-application asmx


【解决方案1】:

一个可能有效的粗略破解。不过我还没有测试过

创建一个文件说Lock。让我们说它在c:\test 目录中

class Program
{
    static void Main(string[] args)
    {
        try{
           File.OpenOrCreate(@"c:\test\lock", FileMode.Open, FileAccess.Read, FileShare.None);

        var countryCode = "34";
        WebServiceClient client = new WebServiceClient(); //ASP.NET web service
        var output = client.Process(countryCode);//this is a time consuming process and takes 5 minutes or more
        File.WriteAllText("c:\\test\\country.txt", output);
        }
        catch(Exception e)
        {
           //you can check if there is file if already open message
           return;
       }
    }              
}

【讨论】:

  • 这是一种“粗略的黑客行为”。使用这样的文件进行锁定不仅会带来一系列问题,而且您的示例也无法按提供的方式工作。如果文件不存在,它将失败。使用FileMode.OpenOrCreate
  • @JimMischel 编辑了它。我同意,只是根据我所知道的想出了答案。可能真的有很好的方法,只是还没有遇到过。
  • 只是一个想法。我们可以为每个任务调度程序生成一个单独的线程吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多