我正在创建一个Appdomain来运行一段代码,它实际上可以是任何东西。我希望我的主机进程能够完成所有单词,但异步调用/线程阻止了我的努力。我的代码是这样的:
AppDomain ad = AppDomain.CreateDomain(...);
WorkUnit mbro = (WorkUnit)ad.CreateInstanceAndUnwrap(...);
mbro.Run();
工作单位会像这样执行异步调用:
class WorkUnit {
public override void Run()
{
WebClient wb = new WebClient();
wb.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wb_DownloadStringCompleted);
wb.DownloadStringAsync(new Uri("http://localhost/WhoTouches/ThreadSleep.aspx"));
}
void wb_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
Console.WriteLine("job is done now");
}
}
我正在寻找的是一种了解一切何时完成的方法。我不确定如何,但前几天我发现如果你在ASPX页面中使用了那个WorkUnit,那么在async webclient调用完成之前它将无法完成请求。重点是,它可能但我不知道如何。
答案 0 :(得分:0)
我不熟悉WorkUnit类,但如果找到运行它的线程,则可以使用Thread.Join。我不确定这会回答你的问题......但也许会给你指向正确的方向。
答案 1 :(得分:0)
如果我正确理解你的问题,你希望主线程阻塞,直到异步调用结束。在这种情况下,我建议使用一个事件对象,并在WorkUnit类的DownloadStringCompleted方法中发出信号。这是你的代码稍作修改:
public class WorkUnit : MarshalByRefObject
{
private AutoResetEvent _event = new AutoResetEvent(false);
public void Run()
{
WebClient wb = new WebClient();
wb.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wb_DownloadStringCompleted);
wb.DownloadStringAsync(new Uri("some uri"));
Console.WriteLine("Waiting for download to comlete...");
_event.WaitOne();
Console.WriteLine("done");
}
void wb_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
Console.WriteLine("job is done now");
_event.Set();
}
}
希望这能让您了解如何继续执行任务