Ожидание завершения кода Appdomain - PullRequest
0 голосов
/ 10 ноября 2009

Я создаю 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");
}
}

Я ищу способ узнать, когда все сделано. Я не уверен, как, но на днях я обнаружил, что если бы вы использовали этот WorkUnit на странице ASPX, он не завершил бы запрос до завершения асинхронного вызова веб-клиента. Суть в том, что это возможно, но я не знаю, как.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2009

если я правильно понимаю ваш вопрос, вы хотите, чтобы основной поток блокировался до завершения асинхронного вызова. В этом случае я бы рекомендовал использовать объект события и сигнализировать о нем в методе DownloadStringCompleted вашего класса WorkUnit. Вот ваш код немного изменен:

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

надеюсь, что это даст вам представление о том, как приступить к выполнению вашей задачи

0 голосов
/ 10 ноября 2009

Я не знаком с классом WorkUnit, но если вы найдете поток, в котором он работает, вы можете использовать Thread.Join . Я не уверен, что это отвечает на ваш вопрос ... но, возможно, дает вам указатель в правильном направлении.

...