C# 中的动作委托
Action Delegation in C#
我正在审查 API 示例应用程序中的一些代码,需要一些帮助以更好地理解整个示例应用程序中的 Action<T>
委托。我在整个代码中提出了几个问题。感谢任何帮助
API 在 Client.cs
class 中实现,当我从应用程序发出请求时,API 将响应发送到 [=] 中的函数13=] 已实施。
/***** Client.cs *****/
public event Action<int, int, int> TickSize;
void tickSize(int tickerId, int field, int size)
{
var tmp = TickSize;
//What is the point of tmp, and why do we check if it is not null?
if (tmp != null)
//This invokes the Action? ie - fires the TickSize Action event?
tmp(tickerId, field, size);
}
然后 UI.cs
class 处理 UI 交互并将信息反馈到 UI 以便用户可以看到返回的数据
/***** UI.cs *****/
//Delegate to handle reading messages
delegate void MessageHandlerDelegate(Message message);
protected Client client;
public appDialog(){
InitializeComponent();
client = new Client();
.
.
//Subscribes the client_TickSize method to the client.TickSize action?
client.TickSize += client_TickSize;
}
void client_TickSize(int tickerId, int field, int size){
HandleMessage(new Message(ticketID, field, size));
}
public void HandleMessage(Message message){
//So, this.InvokeRequired checks if there is another thread accessing the method?
//Unclear as to what this does and its purpose
//What is the purpose of the MessageHandlerDelegate callback
// - some clarification on what is going on here would be helpful
if (this.InvokeRequired)
{
MessageHandlerDelegate callback = new MessageHandlerDelegate(HandleMessage);
this.Invoke(callback, new object[] { message });
}
else
{
UpdateUI(message);
}
}
private void UpdateUI(Message message) { handle messages }
来自the docs
Events are a special kind of multicast delegate that can only be invoked from within the class or struct where they are declared (the publisher class). If other classes or structs subscribe to the event, their event handler methods will be called when the publisher class raises the event
所以在 Client.cs
中你有一个名为 TickSize
的多播代理。此委托使其他 类 能够订阅与其关联的事件。所以在你的函数 void tickSize(int tickerId, int field, int size)
中,你想让所有其他订阅者知道一个 tick 事件已经发生。
为此,您首先要查看是否有订阅者。这是 null
检查发生在 if (tmp != null)
的地方。不需要 tmp
,您可以完成 if(TickSize != null)
如果您注册了任何事件处理程序,它将触发并且订阅者将收到该调用。在您的情况下,您确实有订阅者,因为您正在使用此代码订阅 public AppDialog
中的事件:client.TickSize += client_TickSize;
因此,每当 Client.cs
中调用 void tickSize(...)
时,void client_TickSize(...)
中的代码将 运行。这将调用 HandleMessage
,它将检查它是否需要由 Invoke
函数调用,因为调用代码不在 UI 线程上。如果确实需要使用 Invoke
调用它,它将使用当前控件的 Invoke
函数调用相同的消息(不确定哪个控件,可能是 Form
)。 HandleMessage
然后会发现 Invoke
不是必需的,因为调用者在 UI 线程上,然后它会调用 UpdateUi
来更新控件。
我正在审查 API 示例应用程序中的一些代码,需要一些帮助以更好地理解整个示例应用程序中的 Action<T>
委托。我在整个代码中提出了几个问题。感谢任何帮助
API 在 Client.cs
class 中实现,当我从应用程序发出请求时,API 将响应发送到 [=] 中的函数13=] 已实施。
/***** Client.cs *****/
public event Action<int, int, int> TickSize;
void tickSize(int tickerId, int field, int size)
{
var tmp = TickSize;
//What is the point of tmp, and why do we check if it is not null?
if (tmp != null)
//This invokes the Action? ie - fires the TickSize Action event?
tmp(tickerId, field, size);
}
然后 UI.cs
class 处理 UI 交互并将信息反馈到 UI 以便用户可以看到返回的数据
/***** UI.cs *****/
//Delegate to handle reading messages
delegate void MessageHandlerDelegate(Message message);
protected Client client;
public appDialog(){
InitializeComponent();
client = new Client();
.
.
//Subscribes the client_TickSize method to the client.TickSize action?
client.TickSize += client_TickSize;
}
void client_TickSize(int tickerId, int field, int size){
HandleMessage(new Message(ticketID, field, size));
}
public void HandleMessage(Message message){
//So, this.InvokeRequired checks if there is another thread accessing the method?
//Unclear as to what this does and its purpose
//What is the purpose of the MessageHandlerDelegate callback
// - some clarification on what is going on here would be helpful
if (this.InvokeRequired)
{
MessageHandlerDelegate callback = new MessageHandlerDelegate(HandleMessage);
this.Invoke(callback, new object[] { message });
}
else
{
UpdateUI(message);
}
}
private void UpdateUI(Message message) { handle messages }
来自the docs
Events are a special kind of multicast delegate that can only be invoked from within the class or struct where they are declared (the publisher class). If other classes or structs subscribe to the event, their event handler methods will be called when the publisher class raises the event
所以在 Client.cs
中你有一个名为 TickSize
的多播代理。此委托使其他 类 能够订阅与其关联的事件。所以在你的函数 void tickSize(int tickerId, int field, int size)
中,你想让所有其他订阅者知道一个 tick 事件已经发生。
为此,您首先要查看是否有订阅者。这是 null
检查发生在 if (tmp != null)
的地方。不需要 tmp
,您可以完成 if(TickSize != null)
如果您注册了任何事件处理程序,它将触发并且订阅者将收到该调用。在您的情况下,您确实有订阅者,因为您正在使用此代码订阅 public AppDialog
中的事件:client.TickSize += client_TickSize;
因此,每当 Client.cs
中调用 void tickSize(...)
时,void client_TickSize(...)
中的代码将 运行。这将调用 HandleMessage
,它将检查它是否需要由 Invoke
函数调用,因为调用代码不在 UI 线程上。如果确实需要使用 Invoke
调用它,它将使用当前控件的 Invoke
函数调用相同的消息(不确定哪个控件,可能是 Form
)。 HandleMessage
然后会发现 Invoke
不是必需的,因为调用者在 UI 线程上,然后它会调用 UpdateUi
来更新控件。