public partial class MainPage : UserControl
{
private WebRequest m_request;
public MainPage()
{
InitializeComponent();
MessageBox.Show("began!");
ThreadPool.QueueUserWorkItem(o => Run1(AssyncCallback));
}
public void Run1(AsyncCallback callback)
{
Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show("run called"));
m_request = WebRequest.Create(@"http://localhost:9892/testGet.htm");
m_request.BeginGetResponse(callback, null);
Thread.Sleep(5000);
Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show("finish"));
}
public void AssyncCallback(IAsyncResult ar)
{
Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show("inside"));
try {
m_request.EndGetResponse(ar);
Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show("ok"));
}
catch (Exception e) {
Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show(e.Message));
throw;
}
}
}
Прекрасно работает с моей локальной машиной, где testGet.htm локально для SL-приложения.
Отображаются окна сообщений, начинаются, запускаются, внутри, ок, а затем через 5 секунд заканчиваются
Edit:
То, что вы предлагаете в теории, может не сработать, если у нас будет следующее изменение кода, как вы предлагаете:
public MainPage()
{
InitializeComponent();
MessageBox.Show("began!");
ThreadPool.QueueUserWorkItem(o => Run1(AssyncCallback));
Thread.Sleep(5000);
MessageBox.Show("outer ended")
}
public void Run1(AsyncCallback callback)
{
Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show("run called"));
m_request = WebRequest.Create(@"http://localhost:9892/testGet.htm");
m_request.BeginGetResponse(callback, null);
Deployment.Current.Dispatcher.BeginInvoke(() => MessageBox.Show("finish"));
}
Вы не можете ожидать, что какое-либо окно сообщения будет отображаться до того, как будет показан "внешний конец", потому что это эквивалентно вызову
ThreadPool.QueueUserWorkItem(o =>
{
MessageBox.Show("one");
Thread.Sleep(5000);
MessageBox.Show("one ended");
});
ThreadPool.QueueUserWorkItem(o => MessageBox.Show("two"));
ThreadPool.QueueUserWorkItem(o => MessageBox.Show("three"));
если ThreadPool MaxThreads был равен 1. Вы не можете ожидать, что «два» будет отображаться до того, как «один закончился», он не может внедрить его в середине выполнения первого делегата из очереди.