何时应该使用UdpClient.BeginReceive?何时应该在后台线程上使用UdpClient.Receive?

3
基本上,除了显而易见的区别之外,它们之间有什么不同?我应该在什么情况下使用哪种形式?
class What
{
    public Go()
    {
        Thread thread = new Thread(new ThreadStart(Go2));
        thread.Background = true;
        thread.Start();
    }
    private Go2()
    {
        using UdpClient client = new UdpClient(blabla)
        {
            while (stuff)
            {
                client.Receive(guh);
                DoStuff(guh);
            }
        }
    }
}

对比

class Whut
{
    UdpClient client;
    public Go()
    {
        client = new UdpClient(blabla);
        client.BeginReceive(guh, new AsyncCallback(Go2), null);
    }
    private Go2(IAsyncResult ar)
    {
        client.EndReceive(guh, ar);
        DoStuff(guh);
        if (stuff) client.BeginReceive(guh, new AsyncCallback(Go2), null);
        else client.Close();
    }
}
1个回答

4
我不认为差异通常会很大,但如果我预期流中有暂停,我会更喜欢完全的异步方法(Begin.../End...),这样回调可以从几层卸载而不是需要额外的线程。异步方法的另一个优点是,您始终可以获取所需的数据,排队另一个异步获取,然后在现有的异步线程上处理新数据,为并行性提供了更多选项(一个读取,一个处理)。当然,这也可以手动完成(也许使用工作队列)。
当然,您可以进行概要分析...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接