简体   繁体   English

如何从C#中的回调方法获取返回值

[英]How to get return value from call back method in c#

I passed "GetFilesRevisions_Results" method for GetAsync which will handle the result for it.But I want to return a integer from "GetFilesRevisions_Results" method.How I can achieve this ? 我为GetAsync传递了“ GetFilesRevisions_Results”方法,该方法将处理结果。但是我想从“ GetFilesRevisions_Results”方法返回一个整数。如何实现此目的? Thanks in advance! 提前致谢!

private int GetVersionNumber(string i_sFileName)
{
    #region Get latest version no.
    int nVerNo = 0;
   // RequestResult result;
    try
    {

    OAuthUtility.GetAsync
       (
       "https://api.dropboxapi.com/1/revisions/auto/",
           new HttpParameterCollection
                        {
                           { "path", i_sFileName },
                           { "access_token", accessToken },
                           { "rev_limit", 1 }
                        },
          callback:  GetFilesRevisions_Results ??? How I can access return variable 
       );
    }
    catch
    { 

    }
    return nVerNo;
    #endregion
}

private int GetFilesRevisions_Results(RequestResult result)
{
    int nVerNo = 0;

    if (result.StatusCode == 200)
    {
        dynamic dynJson = JsonConvert.DeserializeObject(Convert.ToString(result));
        foreach (var item in dynJson)
        {
            nVerNo = Convert.ToInt32(item.rev);
        }

    }
    else
    {
        throw new Exception("Failed to get revisions of files");
    }

    return  nVerNo;
}
#endregion Get version Number

There's no way for you to know when your callback will be invoked, thus a return value is not the proper way to get your int. 您无法知道何时将调用回调,因此返回值不是获取int的正确方法。

You may use an event with an int argument and invoke it from within GetFilesRevisions_Results , just before the return . 您可以将事件与int参数一起GetFilesRevisions_Results ,并在return之前从GetFilesRevisions_Results内部调用它。 You will then be able to use your integer value from any of this event listeners. 然后,您将可以使用任何此事件侦听器中的整数值。

You probably want to use a wait handle: 您可能要使用等待句柄:

AutoResetEvent waitHandle = new AutoResetEvent(false);
int nVerNoGlobalTempHolder = 0;

private int GetVersionNumber(string i_sFileName)
{
    #region Get latest version no.
    for (int i = 0; i < 10 && nVerNoGlobalTempHolder != 0; i++)
    {
       //Someone is waiting for this callback already...
       //Do something like:
       Thread.Sleep(500);
    }
    If (nVerNoGlobalTempHolder == 0) throw new Exception("timeout");

   // RequestResult result;
    try
    {

    OAuthUtility.GetAsync
       (
       "https://api.dropboxapi.com/1/revisions/auto/",
           new HttpParameterCollection
                        {
                           { "path", i_sFileName },
                           { "access_token", accessToken },
                           { "rev_limit", 1 }
                        },
          callback:  GetFilesRevisions_Results ??? How I can access return variable 
       );
    }
    catch
    { 

    }
    waitHandle.WaitOne();
    int nVerNo =nVerNoGlobalTempHolder;

    nVerNoGlobalTempHolder = 0;//Reset this in case you have multiple thread calling it
    return nVerNo;    
}


private int GetFilesRevisions_Results(RequestResult result)
{

    if (result.StatusCode == 200)
    {
        dynamic dynJson = JsonConvert.DeserializeObject(Convert.ToString(result));
        foreach (var item in dynJson)
        {
            nVerNoGlobalTempHolder = Convert.ToInt32(item.rev);
        }

    }
    else
    {
        throw new Exception("Failed to get revisions of files");
    }
    WaitHandle.Set();

}

This also implements very basic syncing in case more than one thread calls it. 如果有多个线程调用它,这还将实现非常基本的同步。 If you you dont need that, remove the the for loop at the start 如果不需要,请在开始时删除for循环

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM