C# 在子线程中保持执行时异步运行例程?

C# 在子线程中保持执行时异步运行例程?,c#,C#,我正在处理一个UDP侦听器windows应用程序,一旦UDP消息到达应用程序,我将创建一个新的专用线程,该线程将执行一个与此UDP消息相关的例程 此例程称为异步 为什么是异步的 主要是为了在UDP到来时保持顺序,因为异步调用在线程池中排队(如果让每个线程运行同步,则情况并非如此) 我的问题是: 异步运行例程是一个好主意吗?即使这个例程是在子线程中运行的 如果是,我是否应该为这个异步调用实现IsBusy最佳实践,即使它是一个fire-and-forget模式 我希望我能很好地解释我想要实现的目

我正在处理一个UDP侦听器windows应用程序,一旦UDP消息到达应用程序,我将创建一个新的专用线程,该线程将执行一个与此UDP消息相关的例程

此例程称为异步

为什么是异步的

主要是为了在UDP到来时保持顺序,因为异步调用在线程池中排队(如果让每个线程运行同步,则情况并非如此)

我的问题是:

  • 异步运行例程是一个好主意吗?即使这个例程是在子线程中运行的
  • 如果是,我是否应该为这个异步调用实现IsBusy最佳实践,即使它是一个fire-and-forget模式
我希望我能很好地解释我想要实现的目标

为我的英语不好道歉

问候

xPridex

注:这不是准确的代码,我已经删除了很多关于可行性的细节

/// <summary>
/// Launch SendNotificationToEBSECW treatment.
/// </summary>
/// <param name="sender">object : UDPmsg_t_Mapping</param>
private void StartPrepared(object sender)
{
            mainThread = new Thread(new ParameterizedThreadStart(EntryPointV3));
            mainThread.Start(sender);
}

private readonly object _sync = new object();
private bool _myTaskIsRunning = false;

public bool IsBusy
{
  get { return _myTaskIsRunning; }
}


public void DoWorkAsynch(Tuple.Create(x,y))
{
  MyTaskWorkerDelegate worker = new MyTaskWorkerDelegate(EntryPointV3);
  AsyncCallback completedCallback = new AsyncCallback(MyTaskCompletedCallback);

  lock (_sync)
  {
    if (_myTaskIsRunning)
      throw new InvalidOperationException("currently busy.");

    AsyncOperation async = AsyncOperationManager.CreateOperation(null);
    worker.BeginInvoke(Tuple.Create(x,y), completedCallback, async);
    _myTaskIsRunning = true;
  }
}

private void MyTaskCompletedCallback(IAsyncResult ar)
{
  // get the original worker delegate and the AsyncOperation instance
  MyTaskWorkerDelegate worker =
    (MyTaskWorkerDelegate)((AsyncResult)ar).AsyncDelegate;
  AsyncOperation async = (AsyncOperation)ar.AsyncState;

  // finish the asynchronous operation
  worker.EndInvoke(ar);

  // clear the running task flag
  lock (_sync)
  {
    _myTaskIsRunning = false;
  } 

  // raise the completed event
  AsyncCompletedEventArgs completedArgs = new AsyncCompletedEventArgs(null,
    false, null);
  async.PostOperationCompleted(
    delegate(object e) { OnMyTaskCompleted((AsyncCompletedEventArgs)e); },
    completedArgs);
}

public event AsyncCompletedEventHandler MyTaskCompleted;

protected virtual void OnMyTaskCompleted(AsyncCompletedEventArgs e)
{
  if (MyTaskCompleted != null)
    MyTaskCompleted(this, e);
}
//
///启动SendNotificationToEBSECW治疗。
/// 
///对象:UDPmsg\u t\u映射
私有void StartPrepared(对象发送方)
{
mainThread=新线程(新的参数化线程启动(EntryPointV3));
mainThread.Start(发送方);
}
私有只读对象_sync=新对象();
private bool_mytaskirunning=false;
公共图书馆很忙
{
获取{return\u mytaskirunning;}
}
公共void DoWorkAsynch(Tuple.Create(x,y))
{
MyTaskWorkerDelegate worker=新的MyTaskWorkerDelegate(入口点v3);
AsyncCallback completedCallback=新的AsyncCallback(MyTaskCompletedCallback);
锁定(同步)
{
如果(_mytask正在运行)
抛出新的InvalidOperationException(“当前正忙”);
AsyncOperation async=AsyncOperationManager.CreateOperation(空);
worker.BeginInvoke(Tuple.Create(x,y),completedCallback,async);
_myTaskIsRunning=true;
}
}
私有void MyTaskCompletedCallback(IAsyncResult ar)
{
//获取原始工作代理和AsyncOperation实例
MyTaskWorkerDelegate工人=
(MyTaskWorkerDelegate)((AsyncResult)ar.AsyncDelegate;
AsyncOperation async=(AsyncOperation)ar.AsyncState;
//完成异步操作
worker.EndInvoke(ar);
//清除正在运行的任务标志
锁定(同步)
{
_myTaskIsRunning=false;
} 
//提出已完成的事件
AsyncCompletedEventArgs completedArgs=新的AsyncCompletedEventArgs(空,
假,空);
async.PostOperationCompleted(
委托(对象e){OnMyTaskCompleted((AsyncCompletedEventArgs)e);},
完成参数);
}
公共事件AsyncCompletedEventHandler MyTaskCompleted;
受保护的虚拟void OnMyTaskCompleted(AsyncCompletedEventArgs e)
{
如果(MyTaskCompleted!=null)
MyTaskCompleted(本,e);
}

该代码没有明显的错误,但我有几点意见:

  • 新线程
    不使用线程池,它总是创建一个新的专用线程
  • 创建新的专用线程或使用线程池都不能确保线程按顺序完成,因为线程调度、完成的工作以及其他超出您控制范围的事情
如果必须按接收顺序处理消息,则不应在单独的线程中处理每条消息。相反,将每条消息添加到队列中,并在后台线程中顺序处理队列中的每个项目


线程没有任何内置的方式在它们完成时通知它们的创建者,或者返回结果。如果要这样做,请使用
System.MulticastDelegate.BeginInvoke
;它使用线程池。如果你想在线程运行时获得中间结果,请使用
BackgroundWorker

请向我们展示你如何“创建一个新的专用线程”以及如何“调用”它。我只是更新了帖子以添加代码。非常感谢Dour High Arch的深入解释,现在我已经得到了它