等待Appdomain代码完成

时间:2009-11-10 00:11:19

标签: c# multithreading appdomain

我正在创建一个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调用完成之前它将无法完成请求。重点是,它可能但我不知道如何。

2 个答案:

答案 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();
   }
 }

希望这能让您了解如何继续执行任务