Как использовать делегат для выполнения обратного вызова между вызывающим и вспомогательным классом веб-службы? - PullRequest
0 голосов
/ 13 апреля 2010

У меня есть 2 класса A и B, где они принадлежат одному и тому же пространству имен, но находятся в отдельных файлах, а именно a.cs и b.cs, где класс B по сути является помощником, заключающим в себе вызов веб-службы следующим образом:

public class A
{
    public A() // constructor
    {
        protected static B b = new B();
    }

    private void processResult1(string result)
    {
        // come here when result is successful
    }

    private void processResult2(string result)
    {
        // come here when result is failed
    }
    static void main()
    {
        b.DoJobHelper(...);
    }
}

public class B
{
    private com.nowhere.somewebservice ws;
    public B()
    {
        this.ws = new com.nowhere.somewebservice();
        ws.JobCompleted += new JobCompletedEventHandler(OnCompleted);
    }
    void OnCompleted(object sender, JobCompletedEventArgs e)
    {
        string s = e.Result;
        Guid taskID = (Guid)e.UserState;
        switch (s)
        {
             case "Success":
             // Call processResult1(); 
             break;
             case "Failed":
             // Call processResult2(); 
             break;
             default: break;
        }
    }
    public void DoJobHelper()
    {
        Object userState = Guid.NewGuid();
        ws.DoJob(..., userState);
    }        
}

(1) Я видел тексты в сети об использовании делегатов для обратных вызовов, но не смог применить это в моем случае. Все, что я хочу сделать, это вызвать соответствующий processResult() метод при OnCompleted() событии, но не знаю, как и где объявить делегата:

public delegate void CallBack(string s);

(2) Есть объект отправителя, переданный в OnCompleted(), но никогда не использовавшийся, я что-то там пропустил? Или как я могу использовать sender?

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 13 апреля 2010

1)

public class A
{
    public A() // constructor
    {
        protected static B b = new B(processResult1, processResult2);
    }

    private void processResult1(string result)
    {
        // come here when result is successful
    }

    private void processResult2(string result)
    {
        // come here when result is failed
    }
    static void main()
    {
        b.DoJobHelper(...);
    }
}

public class B
{
    private com.nowhere.somewebservice ws;
    private Action<string> success;
    private Action<string> failure;
    public B(Action<string> success, Action<string> failure)
    {
        this.success = success;
        this.failure = failure;
        this.ws = new com.nowhere.somewebservice();
        ws.JobCompleted += new JobCompletedEventHandler(OnCompleted);
    }
    void OnCompleted(object sender, JobCompletedEventArgs e)
    {
        string s;
        Guid taskID = (Guid)e.UserState;
        //this switch will never do anything because s is null right now.
        //you'll need to check some actual state, or translate some other
        //state into the "Success" and "Failure" words for the s variable
        //before you call this switch statement.
        switch (s)
        {
             case "Success":
             {    
               success(s);
               break;
             }
             case "Failed":
             {
               failure(s);
               break;
             }
             default: break;
        }
    }
    public void DoJobHelper()
    {
        Object userState = Guid.NewGuid();
        ws.DoJob(..., userState);
    }        
}

2) не беспокойтесь об использовании отправителя. это важно только в том случае, если один и тот же метод-обработчик обрабатывает несколько событий объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...