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

複数のappDomainsでメソッド「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 に答える