这是关于两个示例的基本代码:
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 个请求。第二个示例可能需要一分钟才能失败。
为什么?