2012-11-04 3 views
1

Возможные Дублировать:
Stop running the code after 15 secondsПрекратить код после периода времени

Я имею дело с кодом анализатор пакетов, и я просто хочу, чтобы сделать некоторые изменения к нему. Теперь я пытаюсь отредактировать его, так что, как только я запустил программу, он будет захватывать пакеты всего 15 секунд. Ниже приведена часть кода, которая перехватывает пакеты, и, как вы можете видеть, я имею дело с Try/Catch/Throw и работает как цикл.

 public void Start() { 
      if (m_Monitor == null) 
      { 

       try 
       { 

        m_Monitor = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); 
        m_Monitor.Bind(new IPEndPoint(IP, 0)); 
        m_Monitor.IOControl(SIO_RCVALL, BitConverter.GetBytes((int)1), null); 
        m_Monitor.BeginReceive(m_Buffer, 0, m_Buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null); 
       } 
       catch 
       { 
        m_Monitor = null; 
        throw new SocketException(); 
       } 
      } 
    } 
    /// <summary> 
    /// Stops listening on the specified interface. 
    /// </summary> 
    public void Stop() { 
     if (m_Monitor != null) { 
      m_Monitor.Close(); 
      m_Monitor = null; 
     } 
    } 
    /// <summary> 
    /// Called when the socket intercepts an IP packet. 
    /// </summary> 
    /// <param name="ar">The asynchronous result.</param> 
    /// 
    private void OnReceive(IAsyncResult ar) { 
      try 
      { 
       int received = m_Monitor.EndReceive(ar); 
       try 
       { 
        if (m_Monitor != null) 
        { 
         byte[] packet = new byte[received]; 
         Array.Copy(Buffer, 0, packet, 0, received); 
         OnNewPacket(new Packet(packet)); 
        } 
       } 
       catch { } // invalid packet; ignore 
       m_Monitor.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null); 
      } 
      catch 
      { 
       Stop(); 
      } 
    } 

Как вы думаете, я могу изменить этот код так, что он будет остановлен сразу начинается после 15 секунд, например? Я попытался использовать DateTime, но он не был успешным, и я не мог разбить этот так называемый цикл.

+0

ну, это расширенный вопрос ... Меня попросили открыть еще один вопрос ... – iSi

+0

@iSi Можете ли вы добавить код, который на самом деле вызывает 'Start()' –

ответ

0

Я думаю, вам нужно измерить время и остановить код после определенного времени, скажем, «15 секунд», StopWatch класс может помочь вам.

// Create new stopwatch instance 
Stopwatch stopwatch = new Stopwatch(); 
// start stopwatch 
stopwatch.Start(); 
// Stop the stopwatch 
stopwatch.Stop(); 
// Write result 
Console.WriteLine("Time elapsed: {0}",stopwatch.Elapsed); 
// you can check for Elapsed property when its greater than 15 seconds 
//then stop the code 

Истекшее имущество returns TimeSpan экземпляр, который вы бы сделали примерно так.

TimeSpan timeGone = stopwatch.Elapsed; 

Чтобы соответствовать вашему сценарию вы можете сделать что-то вроде этого

Stopwatch stopwatch = new Stopwatch(); 
TimeSpan timeGone; 
// Use TimeSpan constructor to specify: 
// ... Days, hours, minutes, seconds, milliseconds. 
// ... The TimeSpan returned has those values. 
TimeSpan RequiredTimeLine = new TimeSpan(0, 0, 0, 15, 0);//set to 15 sec 

While (timeGone.Seconds < RequiredTimeLine.Seconds) 
{ 
    stopwatch.Start(); 
    Start(); 
    timeGone = stopwatch.Elapsed; 
} 
Stop();//your method which will stop listening 

Некоторые полезные ссылки
MSDN StopWatch

Примечание:
Im»уверен, что у меня есть чтобы дать соберите его проблему с помощью этого базового подхода, любезно также проверьте мои комментарии для другого подхода.

+0

@iSi Я снова проверил ваш код, но could'nt найти то, что вы разместили здесь, как об использовании событий, если время == 15 секунд поднять 'onStop', который затем может вызвать метод stop. –

0

Вы можете использовать

System.Threading.Thread.Sleep(15000); 

и поместить код после него. код будет выполнен после определенной задержки.

Good Luck

+0

Это не мое намерение ... это только поставит поток в течение 15 секунд, а затем запустит его так или иначе ... Мне нужно запустить программу, а затем запустить ее в течение 15 секунд, а затем автоматически остановить ее ... – iSi

+0

@iSi проверить мои предложения, и дайте мне знать –

+0

@dotNetSoldier Я не понимаю вашу точку зрения ...Вы хотите, чтобы я написал условие, чтобы проверить прошедшее время, и если оно превышает 15 секунд, оно остановится, верно? Ну, я думаю, у меня есть основные проблемы с программой, так как я потерял между фрагментами Try/Catch кода и не знаю, где разместить ваши коды ... – iSi

0

Учитывая, что ваш код использует отдельный поток для выполнения реальной работы, вы можете установить его с этим сравнительно небольшим объемом кода:

using System; 
using System.Threading; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static YourSnifferClass sniffer = new YourSnifferClass(); 
     static AutoResetEvent done_event = new AutoResetEvent(false); 

     static void Main(string[] args) 
     {   
      sniffer.Start(); 

      // Wait for 15 seconds or until the handle is set (if you had a 
      // Stopped event on your sniffer, you could set this wait handle 
      // there: done_event.Set() 
      done_event.WaitOne(TimeSpan.FromSeconds(15)); 

      // stop the sniffer 
      sniffer.Stop(); 
     } 
    } 
} 

Надежда, что помогает.

Смежные вопросы