如何在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);
}
}
您可以使用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
的多个侦听器,将导致更容易理解的代码