14

他のプログラマーが一部のハードウェアを制御するために使用するカスタム .net ハードウェア フレームワークを作成しています。ハードウェア フレームワークにアクセスするために、DLL への参照が追加されます。複数のアプリケーション (プロセス) からアクセスされる共有クラスが必要です。

シングルトン パターンが必要なようですが、プロセス内の複数のスレッドに対してのみ機能します。私は完全に間違っている可能性がありますが、これは私が現在持っている C# コードの例です。設計が間違っていると感じずにはいられません。もっと具体的な情報を共有できればいいのですが、できません。

  • お客様のアプリケーションを制御することはできません。ソリューションは、フレームワーク (DLL) 自体に含まれている必要があります。

フレームワーク: (共有 DLL)

public class Resources
{
    static readonly Resources m_instance = new Resources();

    public string Data;

    private Resources()
    {
        Data = DateTime.Now.ToString();
    }

    public static Resources Instance
    {
        get
        {
            return m_instance;
        }
    }
} 

テスト アプリケーション: (最終的に顧客アプリ)

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Press enter to capture the resource!");
        Console.ReadLine();

        var resources = Resources.Instance;
        Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data);

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += WorkerDoWork;
        worker.RunWorkerAsync();

        while (worker.IsBusy)
        {
            Thread.Sleep(100);
        }

        Console.WriteLine("Press enter to close the process!");
        Console.ReadLine();
    }

    static void WorkerDoWork(object sender, DoWorkEventArgs e)
    {
        var resources = Resources.Instance;
        Console.WriteLine("\r\n{0}: {1}\r\n", Thread.CurrentThread.ManagedThreadId, resources.Data);
    }
}

最初に起動したアプリケーションの出力は次のとおりです。

Enter キーを押してリソースを取得してください!

1: 2009 年 6 月 24 日午前 8 時 27 分 34 秒

3: 2009 年 6 月 24 日午前 8:27:34

Enter キーを押してプロセスを閉じます。

2 番目のアプリケーションでは、次の出力が得られます。

Enter キーを押してリソースを取得してください!

9: 2009 年 6 月 24 日午前 8:27:35

10: 2009 年 6 月 24 日午前 8:27:35

Enter キーを押してプロセスを閉じます。

結論

クラスが最初にインスタンス化された時点で、両方のアプリケーションが同じ文字列を返すようにしたいと考えています。

ご覧のとおり、シングルトンはプロセス内の複数のスレッドでは機能しますが、クロスプロセスでは機能しません。解決策が見つからないため、これを実行できない可能性があります。

4

5 に答える 5

7

はい、複数のプロセス間でシングルトンを共有することは可能です。ただし、この結果を得るには、プロセス間通信をサポートするテクノロジを利用する必要があります。

オブジェクトを公平に直接共有できる最も一般的なテクノロジは、Remoting と WCF です。

これらのいずれかとシングルトンを共有する例を挙げることは、SOの回答の範囲を超えています。しかし、これらのそれぞれについて、ウェブ上には多くのチュートリアルがあります。いずれかのテクノロジーとシングルトンをグーグルで検索すると、正しい道にたどり着くはずです。

于 2009-06-24T12:44:36.327 に答える
5

シングルトンを使用してアプリケーション間で同期することはできません。それぞれが独自のアプリケーション空間で実行され、セキュリティの問題として、メモリ/オブジェクトなどにアクセスできません。通信手段なしで (リモーティングのような) もう一方から 2 つを同期するには、3 番目のプログラムにリモート接続する必要があります。

于 2009-06-24T12:43:27.653 に答える
2

ケビンの答えに追加するには、クラス Resources のコンストラクターを真のシングルトンにするために、実際にプライベートにする必要があります。これで問題は解決しませんが、Singleton の誤用を防ぐことができます。

于 2009-06-24T12:44:37.060 に答える
1

2 つの異なるプロセスから別のアセンブリでシングルトン プロパティを呼び出すだけで、そのクラスの異なるインスタンスが作成されます。

ただし、.Net Remotingを使用してプロセス間で情報を簡単に共有したり、単純なシグナリング ( EventWaitHandle )のみが必要な場合はプロセス間イベントを発生させたりできます。

[編集:]呼び出し元にシングルトンのように見せるために、リモーティングを内部的に使用してシングルトンをインスタンス化し、インスタンスを透過的に返すクラスを公開できます。これは(私が思うに)それを行う例です:http://www.codeproject.com/KB/dotnet/remotingsingleton.aspx

于 2009-06-24T12:53:25.607 に答える
0

上記のような方法があります。しかし、WCF やリモーティングを使用する場合は不便です。プロセス間スレッド同期テクニックを試してください。

詳細については、スレッド化に関するオンラインの無料電子ブックを参照してください。

http://www.albahari.com/threading/

ここでクロスプロセス同期構造を特に参照してください...

http://www.albahari.com/threading/part2.aspx#_Synchronization_Essentials

于 2009-06-24T13:00:27.090 に答える