我在C#/.NET 4中遇到了异步方法的问题。它会向w3wp进程添加线程,但不会释放它们。我们的服务器最终达到约400个线程限制,然后应用程序池在回收时变得无法访问。
这里是否有EndInvoke使用错误?
以下是一个简化的示例,可以重现此问题:
这里是否有EndInvoke使用错误?
以下是一个简化的示例,可以重现此问题:
[WebMethod]
public void Test()
{
TestFind("test");
}
private delegate void TestFindDelegate(String val);
private TestFindDelegate tfd;
private IAsyncResult iar;
public void TestFind(String val)
{
try
{
tfd = new TestFindDelegate(this.TestFindAsync);
iar = tfd.BeginInvoke(val, null, null);
}
catch (Exception ex)
{
String msg = ex.Message;
}
}
//Method runs asynchronously
private void TestFindAsync(String val)
{
try
{
//Run stuff here
}
catch (Exception ex)
{
String msg = ex.Message;
}
finally
{
tfd.EndInvoke(iar); //clean up resources
}
}
重现步骤:
1. 将上述代码添加到 web service.asmx 中
2. 打开任务管理器,添加 Threads 列,找到进程
3. 打开 Fiddler ,进入 Composer,输入 web service url/Test
4. 点击执行 20-40 次
5. 观察进程的线程计数增加,但不会减少。
//Run stuff here
这里吗? - Reed Copsey