0

while ループ内で 1 分ごとに複数の関数を連続して呼び出したい。どの関数の実行時間も 1 分以上かかりますが、他の関数は他の関数が完了するのを待つべきではありません。下のように書くと、

        while (true)
        {
            if(executebinary) BinaryConversion();
            if(emailvalidation) ValidateEmails();

            System.Threading.Thread.Sleep(60000);
        }

関数 BinaryConversion() の遅延は、関数 ValidateEmails() の実行も遅延させます。両方の機能を同時に実行する方法はありますか?

4

2 に答える 2

1

それらを並行して実行したい場合は、 Parallel.Invokeを使用できます。

while (true)
{

    Parallel.Invoke(BinaryConversion, ValidateEmails);

    System.Threading.Thread.Sleep(1000);
}

あなたの編集に基づいて、より長い例:

namespace CSharp
{
  using System;
  using System.Threading.Tasks;

  class Program
  {
    static void Main()
    {
      bool executebinary = true;
      bool emailvalidation = false;

      while (true)
      {
        Parallel.Invoke(
          () =>
            {
              if (executebinary)
              {
                BinaryConversion();
              }
            },
          () =>
            {
              if (emailvalidation)
              {
                ValidateEmails();
              }
            });

        System.Threading.Thread.Sleep(1000);
      }
    }

    private static void ValidateEmails()
    {

    }

    private static void BinaryConversion()
    {

    }
  }
}

あなたのコメントに基づいて、両方が他方からの干渉なしで同時に実行されています:

namespace CSharp
{
  using System;
  using System.Threading.Tasks;

  class Program
  {
    static void Main()
    {
      bool executebinary = true;
      bool emailvalidation = false;

      Parallel.Invoke(
        () =>
          {
            while(true) if (executebinary) BinaryConversion();
          },
        () =>
          {
            while(true) if (emailvalidation) ValidateEmails();
          });
      }
    }

    private static void ValidateEmails()
    {

    }

    private static void BinaryConversion()
    {

    }
  }
}
于 2013-07-17T10:36:07.503 に答える
0

複数の方法があります: C# 5 を使用している場合は、次の 2 つの方法があります。

asyncを使用してメソッドを作成すると、次のことができます

タイマー: 1 分間隔でタイマーを開始し、async & await を使用してメソッドを呼び出します: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx または nvoigt で述べたように

この場合、Thread.Sleep は必要ありません。

以前のバージョンを使用している場合:

引き続きタイマーを使用して、これらのメソッドのデリゲートを作成し、非同期で呼び出すことができます。

http://msdn.microsoft.com/en-us/magazine/cc301332.aspx

thread.sleep を回避したい理由は、それが UI アプリケーションの場合、回避したい 1 分間のスレッドをブロックするためです。

于 2013-07-17T10:46:30.117 に答える