如何在c#中实现这个模式

本文关键字:模式 实现 | 更新日期: 2023-09-27 17:53:14

Class Client{
  main(){
    MyRequest m = new MyRequest();
    m.function();
  }
  onSucess(string s){
    Debug.log("i get data from network:"+s);
  }
}
Class Network{
   sendMyrequest(MyRequest r){
     Thread thread = new Thread(() => sendMyrequestTask(r));
     thread.start(); 
   }
   private void sendMyrequestTask(MyRequest r){
     if(...){
        //call delegate function onSucess(string s)
     }
   }
}
Class MyRequest{
private Network network;
  function(){
    //do something
    network.sendMyrequest(MyRequest r);
  }
}

在这种情况下,回调函数onsuccess (string s)应该是一个委托,或一个接口,我应该如何以及在哪里实现它?任何建议都将是感激的。提前感谢!!

编辑:这个问题就像:A调用B,B调用C,当C的工作完成后,C应该调用A。

谢谢大家。我是这样实现的。

public interface CallbackFunction{
   public onSucess(string s);
}
Class Client:CallbackFunction{
  main(){
    MyRequest m = new MyRequest();
    m.function(this);
  }
  onSucess(string s){
    Debug.log("i get data from network:"+s);
  }
}
Class Network{
   sendMyrequest(MyRequest r,CallbackFunction c){
     Thread thread = new Thread(() => sendMyrequestTask(r,c));
     thread.start(); 
   }
   private void sendMyrequestTask(MyRequest r,CallbackFunction c){
     if(...){
        //call delegate function onSucess(string s)
        c.onSucess("bla bla bla");
     }
   }
}
Class MyRequest{
private Network network;
  function(CallbackFunction c){
    //do something
    network.sendMyrequest(this,c);
  }
}

如何在c#中实现这个模式

您可以使用async和' await.

查看更多信息:

许多方法不会立即返回。方法可能需要查询外部源。这需要时间。通过async和await,我们形式化并明确了异步、非阻塞方法的开始和结束方式。

http://msdn.microsoft.com/en-us/library/hh191443.aspx

http://msdn.microsoft.com/en-us/library/hh156513.aspx

通过在MyRequest中使用Action<>委托作为构造函数参数,我们可以实现如下目的:

您可以将Action<>类型替换为您可能想要使用的任何其他委托。Action<>Func<>应该涵盖几乎所有内容。

顺便说一下,你的代码,也就是我下面的代码是而不是观察者模式。
public class Client
{
    static void Main(string[] args)
    {
        var client = new MyRequest(OnSuccess);
        client.Function();
        //Output:
        //I'm in the callback
        //Foo.Bar()
        Console.ReadKey();
    }
    static void OnSuccess(string result)
    {
        Console.WriteLine("I'm in the callback");
        Console.WriteLine(result);
    }
}
public class Network
{
    public void SendMyRequest(MyRequest request)
    {
        var result = "Foo.Bar()";
        if (!String.IsNullOrEmpty(result))
        {
            request.SuccessCallback(result);
        }
    }
}
public class MyRequest
{
    public Action<string> SuccessCallback { get; private set; }
    private Network _network;
    public MyRequest(Action<string> successCallback)
    {
        _network = new Network();
        SuccessCallback = successCallback;
    }
    public void Function()
    {
        _network.SendMyRequest(this);
    }
}

看起来你想实现类似WebClient的东西。DownloadStringCompleted事件。它使用以下委托类型:

public delegate void DownloadStringCompletedEventHandler(
    Object sender
    DownloadStringCompletedEventArgs e)`

使用模式如下:

WebClient client = new WebClient ();
client.DownloadStringCompleted += DownloadStringCallback2;
client.DownloadStringAsync (new Uri(address));

注意:如果您不期望使用async/await的多个侦听器,将导致更容易理解的代码