2012-12-14 84 views
0

我正在使用UDP侦听器Windows应用程序,一旦UDP消息到达应用程序,我创建了一个新的专用线程,它执行与此udp消息相关的例程。即使在子线程中执行执行也会异步运行例程?

这个例程被称为异步。

为什么是异步?

主要是为了保持UDP到达的顺序,因为异步调用在线程池中排队(而不是如果我让每个线程运行同步)。

我的问题:

  • 是它的一个子线程异步运行的程序,即使这个程序运行是一个好主意?
  • 如果是的话,我应该实施IsBusy这个异步调用的最佳实践,即使它是一个失火和遗忘模式?

我希望我explianing以及什么我想要实现

道歉我的英文不好

问候

xPridex

注意:这不是正确的代码,我删除很多有关lisibity的细节。

/// <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); 
} 
+0

请向我们展示如何“创建一个新的专用线程”以及如何“呼叫”它。 –

+0

我只是更新帖子来添加代码。 – xPridex

回答

1

没有什么明显的错码,但我有几点意见:

  • new Thread不使用线程池,它总是创建一个新的专用线程。
  • 既不创建新的专用线程也不使用线程池将确保线程按顺序完成,因为线程调度,完成的工作以及其他您不能控制的事情。

如果您必须按收到的顺序处理邮件,则不应在单独的线程中处理每封邮件。相反,将每条消息添加到队列中,并按顺序在后台线程中处理队列中的每个项目。

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

+0

非常感谢Dour High Arch的深层解释,现在我明白了 – xPridex