【问题标题】:Can other method behave as AsyncCallback?其他方法可以表现得像 AsyncCallback 吗?
【发布时间】:2021-06-23 06:40:35
【问题描述】:

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

【问题讨论】:

    标签: c# delegates asynccallback iasyncresult


    【解决方案1】:

    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, loginSession.GetLoginToken(tokenKey, timespan), Login_Result); 
    

    【讨论】:

      猜你喜欢
      • 2013-05-31
      • 2016-10-14
      • 2017-04-09
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 2014-09-17
      相关资源
      最近更新 更多