gpt4 book ai didi

c# - 除非调用线程空闲(方法已完成),否则不会调用 WebRequest 回调

转载 作者:太空宇宙 更新时间:2023-11-03 16:45:34 25 4
gpt4 key购买 nike

这是我的代码(它是 Silverlight!):

public class ThreadTester
{
public void Test()
{
Debug.WriteLine("Outer thread start");
ThreadPool.QueueUserWorkItem(x => RunInner());
Thread.Sleep(2000);
Debug.WriteLine("Outer thread end");
}

private void RunInner()
{
Debug.WriteLine("Inner thread start");

BL bl = new BL();
bl.Run1(AssyncCallback);

Debug.WriteLine("Inner thread end");
}

public void AssyncCallback(IAsyncResult ar)
{
Debug.WriteLine("Async Callback called!");
}

}

public class BL
{
public void Run1(AsyncCallback callback)
{
WebRequest req = WebRequest.Create(@"http://microsoft.com");
req.BeginGetResponse(callback, null);
}
}

这是我在输出窗口中得到的:

Outer thread start
Inner thread start
Outer thread end
Inner thread end
Async Callback called!

知道为什么会这样吗?不应该吗

Outer thread start
Inner thread start
Async Callback called!
Inner thread end
Outer thread end

主要强调回调调用。

提前致谢

最佳答案

回调的要点是,只有在您的请求完成并收到您的响应后才会调用它。

这似乎花费了超过 2 秒,因此线程结束消息发生在回调之前。

此外,Outer thread end 会在 2 秒后立即写入,而 within RunInner() 中的所有内容都是同步发生的,所以 Inner thread end 直到请求完成后才会显示(但在回调执行之前,因为您正在使用异步 BeginGetResponse)。

当我运行你的相同代码时,我实际上得到了这个输出:

Outer thread start
Inner thread start
Inner thread end
Async Callback called!
Outer thread end

这只是意味着请求对我来说只用了不到 2 秒。如果将 Thread.Sleep() 值增加几秒钟,您应该会得到相同的结果。同样,虽然回调是异步调用的,因此 Inner thread end 消息通常会在它之前,但是对于异步处理,您不应该依赖它。

如果不清楚,请在评论中告诉我,我会尝试进一步说明。

编辑

现在我看到您正在使用 Silverlight,问题变得更加清楚了。我认为,如果您将此进行到实际调用 EndGetResponse(),您将得到一个 SecurityException,因为 Silverlight 想要阻止跨站点脚本攻击,通过默认。也就是说,如果没有建立允许访问的策略,您就不能访问不同于您的 Silverlight 应用程序所在域(例如 microsoft.com 或 google.com)中的 URL。

这里有安全策略的详细处理:http://msdn.microsoft.com/en-us/library/cc645032(v=VS.95).aspx

关于c# - 除非调用线程空闲(方法已完成),否则不会调用 WebRequest 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6200902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com