等待应用程序代码完成
我正在创建一个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,它将不会完成请求,直到异步webclient调用完成。点是,它可能但我不知道如何。
如果我正确理解你的问题,你希望主线程阻塞,直到异步调用完成。在这种情况下,我会建议使用事件对象,并在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();
}
}
希望这会给你如何与你的任务
我对WorkUnit类不熟悉,但是如果找到它运行的线程,则可以使用Thread.Join。我不确定这是否会回答你的问题......但也许会给你一个正确的方向。
我已经试过了前进的想法。 线程t =新线程(new ThreadStart(wu.Run)); t.Start(); t.Join(); 它只是继续运行(不会停止加入)。 – 2009-11-10 00:41:19
这是因为您的DownloadStringAsync调用使用另一个线程来执行下载。由于您已经创建了一个新线程,因此您可以使用同步呼叫下载它。 – Matt 2009-11-10 04:03:17
嗨,这不是因为WorkUnit超出了我的控制范围。它可能是一个Addin,甚至是一个ASP.Net页面。基本上我需要能够在任务完成后正确卸载appdomain,以避免在可能的情况下强制WorkUnit发出信号。我避免这个原因是因为一个简单的bug可能会挂起AppDomain,直到发生某种超时。 – 2009-11-10 03:14:43
我想说,你必须假设,如果控制从Run方法返回,那么工作单元已经完成了工作,并将其留给工作单元的实现者,以确保他们等待他们的异步调用完成。这就是BCL线程的工作方式,线程在执行离开threadstart委托时完成。 – Matt 2009-11-10 04:09:30
你有什么想法会ASP.Net管理这种事情吗?我开始认为使用Processes而不是AppDomains会更好。这里的目标是为WorkUnit的实施者提供最可能的控制和易用的体验。 – 2009-11-10 04:13:14