Остановите код после определенного периода времени
Возможный дубликат:
Прекратите запуск кода через 15 секунд
Я имею дело с кодом анализатора пакетов и просто хочу внести в него некоторые изменения. Сейчас я пытаюсь отредактировать его так, чтобы после запуска программы он захватывал пакеты только в течение 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, но он не был успешным, и я не смог разорвать этот так называемый цикл.
3 ответа
Учитывая, что ваш код использует отдельный поток для выполнения реальной работы, вы можете настроить его с помощью этого довольно небольшого количества кода:
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();
}
}
}
Надеюсь, это поможет.
Вы могли бы использовать
System.Threading.Thread.Sleep(15000);
и поставить код после него. код будет выполнен после определенной задержки.
Удачи
Я думаю, что вам нужно измерить время и остановить код после определенного времени, скажем "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
Elapsed свойство возвращает экземпляр 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
Замечания:
Я уверен, что я дал достаточно указателей, чтобы каждый мог разобраться в своей проблеме с помощью этого базового подхода, также просим проверить мои комментарии для другого подхода.