Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中实现这个模式#_C#_Delegates_Unity3d_Observer Pattern - Fatal编程技术网

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

C# 如何在C中实现这个模式#,c#,delegates,unity3d,observer-pattern,C#,Delegates,Unity3d,Observer Pattern,在这种情况下,回调函数onSuces(字符串s)应该是一个委托或一个接口,我应该如何以及在哪里实现它?如有任何建议,将不胜感激。提前谢谢 编辑:这个问题就像:A调用B,B调用C,当C的工作完成后,C应该调用A。如何实现这一点 谢谢大家。我是这样实现的 Class Client{ main(){ MyRequest m = new MyRequest(); m.function(); } onSucess(string s){ Debug.log("i get

在这种情况下,回调函数onSuces(字符串s)应该是一个委托或一个接口,我应该如何以及在哪里实现它?如有任何建议,将不胜感激。提前谢谢

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

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

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

  }

}
你可以用

有关更多信息:

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


看起来您想要实现类似于事件的功能。它使用以下委托类型:

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

  }

}
使用以下使用模式:

public delegate void DownloadStringCompletedEventHandler(
    Object sender
    DownloadStringCompletedEventArgs e)`
注意:如果您不希望多个侦听器使用
async
/
wait
将导致代码更容易理解。

通过在
MyRequest
中使用委托作为构造函数参数,我们可以实现类似的效果

您可以将
操作
类型替换为您可能要使用的任何其他委托<代码>操作或
Func
应该涵盖所有内容

顺便说一句,您的代码,因此我下面的代码不是观察者模式

WebClient client = new WebClient ();
client.DownloadStringCompleted += DownloadStringCallback2;
client.DownloadStringAsync (new Uri(address));
公共类客户端
{
静态void Main(字符串[]参数)
{
var client=newmyrequest(OnSuccess);
client.Function();
//输出:
//我在回电话
//Foo.Bar()
Console.ReadKey();
}
成功时静态无效(字符串结果)
{
WriteLine(“我在回调中”);
控制台写入线(结果);
}
}
公共班级网络
{
公共无效SendMyRequest(MyRequest)
{
var result=“Foo.Bar()”;
如果(!String.IsNullOrEmpty(结果))
{
request.SuccessCallback(结果);
}
}
}
公共类MyRequest
{
公共操作成功回调{get;private set;}
专用网络;
公共MyRequest(操作成功回调)
{
_网络=新网络();
SuccessCallback=SuccessCallback;
}
公共空间功能()
{
_网络。发送我的请求(此);
}
}

不要这样做。相反,请使用
Task
async
/
wait
。我知道,任务将在sendMyrequest()中写入。我的问题是如何编写委托onSuces()。您不需要。
Task
的全部要点是封装一个异步结果。了解承诺。这不是一个异步问题。我们可以假设它立即返回。如果你假设它立即返回,那么你为什么要在后台创建一个线程来执行它呢?我更新了我的问题。我的问题不是异步/等待问题。
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);
    }
}