微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

其他方法可以作为 AsyncCallback 吗?

如何解决其他方法可以作为 AsyncCallback 吗?

我正在统一实施 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),如果我直接通过 { {1}} 作为行中的最后一个参数 (check-3)?这是合法且允许的方式吗?如果是,那么请解释一下为什么允许这样做...

解决方法

tl;博士

可以,只要签名相同

  • 返回 void
  • IAsyncResult 作为唯一参数

-> AsyncCallback

基本上很简单

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。