2017-05-18 3 views
0

두 작업을 병렬로 실행하려면 목표가 있습니다. 카운트 다운이있는 동안 입력을 잠근 상태로하고 싶습니다. 카운터가 0이되면 프로그램은 잠금 입력을 중지해야합니다. 지금까지 잠시 동안 입력을 차단하는 방법을 알고 있지만 동시에 타이머가 있어야 얼마나 오래 걸릴지 알 수 있습니다. 여기 내 코드는 다음과 같습니다.C# - 두 작업을 병렬로 실행

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

그래, 일정 기간 동안 입력을 차단하고 싶습니다. 입력이 차단되는 동안 콘솔에서 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); 
      } 

     }); 


    }