2

我正在尝试为多个 AppDomain 调用 DoCallBack,但它不是异步的。有没有办法使调用异步?这是我正在尝试做的事情:

        var appDomain1 = System.AppDomain.CreateDomain("event1");
        var appDomain2 = System.AppDomain.CreateDomain("event2");

        Console.WriteLine("Executing appDomain1");
        appDomain1.DoCallBack(new CrossAppDomainDelegate(Event));
        Console.WriteLine("Executing appDomain2");
        appDomain2.DoCallBack(new CrossAppDomainDelegate(Event));

我正在尝试在多个 appDomain 中异步执行方法“Event”。

4

3 回答 3

3

您可以使用 TPL,并从任务中调用 DoCallBack:

var task1 = Task.Factory.StartNew(() => appDomain1.DoCallBack(Event));
var task2 = Task.Factory.StartNew(() => appDomain2.DoCallBack(Event));
Task.WaitAll(task1, task2);
于 2012-11-19T18:10:33.380 回答
3

尽管它可以很好地满足您的需求,但 DoCallBack 有点受限。考虑一下这个(也可以并行工作):

namespace ConsoleApplication1
{
    using System;
    using System.Threading.Tasks;
    using AppDomainToolkit;

    class Program
    {
        static void Main(string[] args)
        {
            using (var context1 = AppDomainContext.Create())
            using (var context2 = AppDomainContext.Create())
            {
                var task1 = Task.Factory.StartNew(
                    () =>
                    {
                        RemoteAction.Invoke(
                            context1.Domain, 
                            () => 
                            {
                                var appName = AppDomain.CurrentDomain.SetupInformation.ApplicationName;
                                Console.WriteLine("Hello from app domain " + appName);
                            });
                    });

                var task2 = Task.Factory.StartNew(
                    () =>
                    {
                        RemoteAction.Invoke(
                            context2.Domain,
                            () =>
                            {
                                var appName = AppDomain.CurrentDomain.SetupInformation.ApplicationName;
                                Console.WriteLine("Hello from app domain " + appName);
                            });
                    });

                // Be sure to wait, else the domains will dispose
                Task.WaitAll(task1, task2);
            }

            Console.ReadKey();
        }
    }
}

更多信息可在此处获得:https ://github.com/jduv/AppDomainToolkit

于 2012-11-26T01:35:22.297 回答
2

使用任何通用异步执行机制包装跨域调用它,并可能等到所有调用完成。例如

Parallel.ForEach(appDomains, domain => domain.DoCallBack(new CrossAppDomainDelegate(Event)));

或者

var countDown = new CountdownEvent();
countDown.AddCount();
foreach (var domain in appdomains)
{
    countDown.AddCount();
    ThreadPool.QueueUserWorkItem(_ =>
        {
            domain.DoCallBack(new CrossAppDomainDelegate(Event));
            countDown.Signal();
        });
}

countDown.Signal();
countDown.Wait();
于 2012-11-19T18:10:25.133 回答