1

这是关于两个示例的基本代码:

private void AsyncTest()
{   
    //GetServiceObject Will add custom bindings and more..
    Client client = ClientBuilder.GetServiceObject();

    while (true)
    {
         Semaphore semaphore = new Semaphore(0,1);
         client.BeginTest(BeginTestCallback, new AsyncState
         {
             Client = client,
             Semaphore = semaphore
         });

         semaphore.WaitOne();   
    }   
}

private void BeginTestCallback(IAsyncResult asyncResult)
{
    try
    {
        AsyncState state = asyncResult.AsyncState as AsyncState;

        Client client = state.Client;
        Semaphore semaphore = state.Semaphore;

        Client.EndTest(asyncResult);    

        semaphore.Release();
    }
    catch (Exception e)
    {
        //Will catch the exception here because of Client.EndTest(asyncResult) in the first example
        Debug.Assert(false, e.Message);
    }
}

我们知道回调是在 .net 线程池的线程中调用的。

如果我这样调用 AsyncTest() :

Task.Factory.StartNew(() => AsyncTest());

这意味着 AsyncTest 将在 .net 线程池的线程中运行。在这种情况下,一切都会按预期工作,无一例外。

但是,如果我以这种方式启动线程:

ThreadStart ts = new ThreadStart(() => AsyncTest());
Thread t = new Thread(ts);
t.Start();

即使我把它放在 10 分钟,它也会在“SendTimeout”上执行随机 TimeoutException。当我检查wireshark时,它会随机从我什至没有看到Syn到我们只发送soap标头并关闭连接(仅在超时时)。

请注意,我正在运行 10 个线程,每秒执行 30 个请求。第二个示例可能需要一分钟才能失败。

为什么?

4

0 回答 0