1

サービスにサブスクライブし、コールバックを介してイベントが発生したときに通知するサーバー ツールをセットアップしようとしています。サブスクリプション部分が機能しており、イベントがトリガーされるとコールバックにヒットしますが、これをライブラリに持っていて、メイン プロジェクトに取得したいと考えています。デリゲートでやろうと思ったのですが、構文が思いつきません。

ClientSubscriber.cs

/// <summary>
/// Used by Clients to subscribe to a particular queue
/// <param name="type">Subscription type being subscribed to by client</param>
/// <returns></returns>
public bool Subscribe(string type,)
{
    bool IsSubscribed = false;
    try
    {
        switch (type)
        {
            case "Elements":
            {
                logger.Info("Subscribing toPublisher");
                Subscriber.SubscribeToElements(ElementResponse);
                logger.Info("Subscription Completed");
                IsSubscribed = true;
                break;
            }
        }
    }    
    catch (Exception ex)
    {
        logger.Error(ex);
    }

    return IsSubscribed;
}


public void ElementResponse(Element element, SubscriptionEvent.ActionType eventActionType)
{
    try
    {
        //  stuff to Do
        // Need to Callback to main application
    }
    catch (Exception ex)
    {
        logger.Error(ex);
        throw;
    }
}

Program.cs

static void Main(string[] args)
{
    SubscriberClient client = new SubscriberClient();
    client.Subscribe("SlateQueueElements");

    while (true)
    {
        ConsoleKeyInfo keyInfo = Console.ReadKey(true);

        if (keyInfo.Key == ConsoleKey.X)
            break;
    }
}

では、Element Response 情報をメイン プロジェクトに戻すにはどうすればよいでしょうか。

4

1 に答える 1

2

コールバックが必要な場合は、引数として指定する必要があります。私はいくつかの仮定を立てましたが、これはうまくいくはずです:

public bool Subscribe(string type, Action callback)
{
    bool IsSubscribed = false;
    try
    {
        switch (type)
        {
            case "Elements":
            {
                logger.Info("Subscribing toPublisher");
                Subscriber.SubscribeToElements((e,t) => ElementResponse(e,t,callback));
                logger.Info("Subscription Completed");
                IsSubscribed = true;
                break;
            }
        }
    }    
    catch (Exception ex)
    {
        logger.Error(ex);
    }

    return IsSubscribed;
}

public void ElementResponse(Element element, SubscriptionEvent.ActionType eventActionType, Action callback)
{
    try
    {
        //  stuff to Do
        callback();
    }
    catch (Exception ex)
    {
        logger.Error(ex);
        throw;
    }
}

私はActionデリゲートを使用しましたが、呼び出す方法があれば、何でも代わりに配置できます。プログラムコードは次のようになります。

static void Main(string[] args)
{
    SubscriberClient client = new SubscriberClient();
    client.Subscribe("SlateQueueElements", () => 
    {
       Console.WriteLine("Calling back...");
    });

    while (true)
    {
        ConsoleKeyInfo keyInfo = Console.ReadKey(true);

        if (keyInfo.Key == ConsoleKey.X)
            break;
    }
}
于 2012-09-05T23:39:15.160 に答える