static void __OnCompletedRead(IAsyncResult asyncResult)
    {
        var asyncState = (AsyncState)asyncResult.AsyncState;

        try
        {
            int bytesRead = asyncState.fileStream.EndRead(asyncResult);
            if (bytesRead == asyncState.buffer.Length)
            {
                if (asyncState.callback != null)
                {
                    // callback on main thread
                    SchedulerUtils.MainThread_Invoke(() => {
                        asyncState.callback(asyncState.buffer);
                    });
                }
            }
            else
            {
                Log.Error("[FileUtils] async end read bytes from file {0} error", asyncState.fileStream.Name);
            }
        }
        catch (IOException e)
        {
            Log.Error("[FileUtils] async end read bytes from file {0} error, {1}", asyncState.fileStream.Name, e.Message);
        }
        finally
        {
            asyncState.fileStream.Close();
        }
    }