2017-05-18 7 views
0

私は2つのタスクを並列に実行したい、目標は:カウントダウンがある間、私は入力をロックしたい。カウンタが0になると、プログラムはロック入力を停止する必要があります。これまでのところ、私は入力をしばらくブロックする方法を知っていますが、同時にタイマーを持っていて、どれくらい時間がかかるか教えてくれます。ここに私のコードです:C# - 2つのタスクを並列に実行

using System; 
using System.Threading; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     private static TimeSpan timeSpan = new TimeSpan(0, 5, 0); 

     static void Main(string[] args) 
     { 
      Program program = new Program(); 

      while (timeSpan > TimeSpan.Zero) 
      { 
       program.timer(); 
       //Program.BlockInput(timeSpan); 
      } 

      Console.ReadLine(); 
     } 

     private void timer() 
     { 
      timeSpan -= new TimeSpan(0, 0, 1); 
      Console.WriteLine(timeSpan.ToString()); 
     } 

     private partial class NativeMethods 
     { 
      [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "BlockInput")] 
      [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] 
      public static extern bool BlockInput([System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] bool fBlockIt); 
     } 

     private static void BlockInput(TimeSpan span) 
     { 
      try 
      { 
       NativeMethods.BlockInput(true); 
       Thread.Sleep(span); 
      } 
      finally 
      { 
       NativeMethods.BlockInput(false); 
      } 
     } 

    } 
} 
+0

私はあなたの問題を理解していません。あなたは2つの並列タスクについて話しますか?あなたのコードには何も表示されません。 「私は、どれくらいの時間がかかるか教えてくれるタイマーを持っていたい」:あなたの仕事の実行時間?またはBlockInputの遅延? – Seuleuzeuh

+0

私はしばらく入力をブロックしたがっています。そして、入力がブロックされている間、私はゼロに数えている時間をコンソールで見たいと思う。 – przemoinho

+0

最近、奇妙なことにマルウェアを書き込もうとしている人たちの急増となる縫い目があります。 –

答えて

-1

あなたは単に別のスレッドを使うことができます。 あなたのカウンタはカウントされており、入力はブロックされていますが、他のスレッド上にあるため、何か他の操作を行うことができます。

public void RunTwoThingsAtOnce() 
{ 
    new Thread(() => 
    { 
     while (timeSpan > TimeSpan.Zero) 
     { 
      program.timer(); 
      //Input Block 
     } 

    }).Start(); 

}

1

スレッドが非同期/のawait使用するよりも良いです。次のタスクはスレッドプール上で実行されます。この問題のために専用のスレッドは必要ありません。

private static async Task BlockInput(TimeSpan span) 
    { 
     return Task.Run(()=>{ 
      try 
      { 
       NativeMethods.BlockInput(true); 
       await Task.Delay(span); 
      } 
      finally 
      { 
       NativeMethods.BlockInput(false); 
      } 

     }); 


    } 
関連する問題