其他方法可以作为 AsyncCallback 吗?
Can other method behave as AsyncCallback?
我正在 unity 中实现 vivox,我在教程中遇到了一个情况,这个人用 AsyncCallback
委托做了一些事情,我想确认一下。
using UnityEngine;
using VivoxUnity;
using System;
public class VivoxLearn : MonoBehaviour
{
VivoxUnity.Client client;
ILoginSession loginSession;
private string issuer="";
private string tokenKey = "";
private string domain = "";
private Uri server=new Uri("");
private TimeSpan timespan = new TimeSpan(90);
private AsyncCallback loginCallback; //check-1
private void Awake()
{
client = new Client();
client.Uninitialize();
client.Initialize();
DontDestroyOnLoad(this);
}
void Start()
{
loginCallback = new AsyncCallback(Login_Result); //check-2
}
public void Login(string username)
{
AccountId accountId = new AccountId(issuer, username, domain);
loginSession.BeginLogin(server, loginSession.GetLoginToken(tokenKey, timespan), loginCallback);//check-3
}
private void Login_Result(IAsyncResult ar) //check-4
{
try
{
loginSession.EndLogin(ar);
}
catch (Exception e)
{
Debug.Log(e.Message);
}
}
}
在 check-3 行中,不是创建 AsyncCallback
delegate(check-1) 并将 Login_Result
(check-4) 方法传递给 delegate(check-2),如果我直接将 Login_Result
作为行 (check-3) 的最后一个参数传递?这是合法且允许的方式吗?如果是,请解释一下为什么允许这样做...
tl;博士
可以,只要签名一样就可以
- returns
void
- 将
IAsyncResult
作为唯一参数
基本上就是简单
public delegate void AsyncCallback(IAsyncResult ar);
这基本上等于使用 Action
Action<IAsyncResult>
除了使用 delegate
你可以给参数一些有意义的名字和 XML 文档注释标签。
两者基本上都是signature模板(很仔细的说有点像接口和类型)。您可以为它们分配实现正确签名的任何方法。
如果您不打算在某个地方存储该委托(例如在您的字段中的示例中),那么 - 与任何其他值一样 - 无论您是直接传递回调方法还是通过委托定义(参见 How to declare, instantiated and use a delegate)
loginCallback = new AsyncCallback(Login_Result);
只是旧的写法。你也可以简单地做
loginCallback = Login_Result;
然后,如果您先将其存储在字段中或直接将其传递给方法,则没有任何区别。
所以你也可以直接做
loginSession.BeginLogin(server, loginSession.GetLoginToken(tokenKey, timespan), new AsyncCallback(Login_Result);
或者简单地说
loginSession.BeginLogin(server, loginSession.GetLoginToken(tokenKey, timespan), Login_Result);
我正在 unity 中实现 vivox,我在教程中遇到了一个情况,这个人用 AsyncCallback
委托做了一些事情,我想确认一下。
using UnityEngine;
using VivoxUnity;
using System;
public class VivoxLearn : MonoBehaviour
{
VivoxUnity.Client client;
ILoginSession loginSession;
private string issuer="";
private string tokenKey = "";
private string domain = "";
private Uri server=new Uri("");
private TimeSpan timespan = new TimeSpan(90);
private AsyncCallback loginCallback; //check-1
private void Awake()
{
client = new Client();
client.Uninitialize();
client.Initialize();
DontDestroyOnLoad(this);
}
void Start()
{
loginCallback = new AsyncCallback(Login_Result); //check-2
}
public void Login(string username)
{
AccountId accountId = new AccountId(issuer, username, domain);
loginSession.BeginLogin(server, loginSession.GetLoginToken(tokenKey, timespan), loginCallback);//check-3
}
private void Login_Result(IAsyncResult ar) //check-4
{
try
{
loginSession.EndLogin(ar);
}
catch (Exception e)
{
Debug.Log(e.Message);
}
}
}
在 check-3 行中,不是创建 AsyncCallback
delegate(check-1) 并将 Login_Result
(check-4) 方法传递给 delegate(check-2),如果我直接将 Login_Result
作为行 (check-3) 的最后一个参数传递?这是合法且允许的方式吗?如果是,请解释一下为什么允许这样做...
tl;博士
可以,只要签名一样就可以
- returns
void
- 将
IAsyncResult
作为唯一参数
基本上就是简单
public delegate void AsyncCallback(IAsyncResult ar);
这基本上等于使用 Action
Action<IAsyncResult>
除了使用 delegate
你可以给参数一些有意义的名字和 XML 文档注释标签。
两者基本上都是signature模板(很仔细的说有点像接口和类型)。您可以为它们分配实现正确签名的任何方法。
如果您不打算在某个地方存储该委托(例如在您的字段中的示例中),那么 - 与任何其他值一样 - 无论您是直接传递回调方法还是通过委托定义(参见 How to declare, instantiated and use a delegate)
loginCallback = new AsyncCallback(Login_Result);
只是旧的写法。你也可以简单地做
loginCallback = Login_Result;
然后,如果您先将其存储在字段中或直接将其传递给方法,则没有任何区别。
所以你也可以直接做
loginSession.BeginLogin(server, loginSession.GetLoginToken(tokenKey, timespan), new AsyncCallback(Login_Result);
或者简单地说
loginSession.BeginLogin(server, loginSession.GetLoginToken(tokenKey, timespan), Login_Result);