在意外的时间调用了一个方法。 (HRESULT异常:0x8000000E)

时间:2016-12-14 14:46:43

标签: c# asynchronous deadlock

我的情况:我正在登录我的应用。登录后,将加载聊天(它是聊天应用程序)。我试图使用DataWriter.StoreAsync,但它总会抛出此异常:

  

在意外时间调用了一个方法。 (HRESULT的例外情况:   0x8000000E)

我在过去几天里已经阅读了很多关于异步代码的内容,而且我在这个例外中遇到了很多困难。我(相信)知道的事情:

  • 每次我运行异步代码时都需要使用await,否则我的代码不会等待返回并抛出异常
  • 我需要避免async void,因为它不会返回(只有例外:事件)
  • 我使用它之后需要处理DataWriter以确保使用相同的DataWriter
  • 确保不会有多个线程

不幸的是,我的代码仍然抛出上述异常。也许我忘记了某些事情或了解了async错误的内容。

由于我正在使用服务器,因此我无法提供示例项目。抱歉!代码墙现在传入,抱歉,但我的错误可能在此代码的任何地方。代码按从上到下执行的时间排序:

LoginCommandMainPageViewModel的实例:

LoginCommand = new DelegateCommand(Login);

我的Login方法:

private async void Login()
{
    _evaLogger.Info("Trying to log in (online)...");
    await LoginOnline();
    _evaLogger.Info("Logged in (online)!!!");
}

该方法为async void而不是async Task,因为DelegateCommand不允许TaskDelegateCommand.FromAsyncHandler已过时。但除此之外,我已经尝试DelegateCommand.FromAsyncHandler并且它没有解决问题。

LoginOnline()

private async Task LoginOnline()
{
    // ... Other code ...
    await _websocketManager.connect(_accountInformation.GetToken(), _eventAggregator, _evaLogger, _dependencyService);
}

我的UWP实施的_websocketManager.connect()方法是:

public async Task connect(string token, IEventAggregator eventAggregator, EvaLogger evaLogger, IDependencyService dependencyService)
{
    try
    {
        messageWebsocket.SetRequestHeader("iPlanetDirectoryPro", token);
        DependencyService = dependencyService;
        _eventAggregator = eventAggregator;
        _evaLogger = evaLogger;
        _localDataManager = new SqliteLocalDataManager(_evaLogger, _eventAggregator, dependencyService);
        messageWebsocket.Control.MessageType = SocketMessageType.Utf8;
        messageWebsocket.MessageReceived += OnMessageReceived;
        messageWebsocket.Closed += OnClosed;
        messageWebsocket.ServerCustomValidationRequested += OnOpened;

        _evaLogger.Info("WebsocketManager.Connect();");

        await messageWebsocket.ConnectAsync(WSURI); // This triggers the OnOpened event
    }
    catch (Exception e)
    {
        _evaLogger.Error(e.Message, e);
    }
}

然后触发OnOpened事件,调用OnOpened方法。在其他一些与此异常无关的代码之后,在导航工作正常后,调用async void OnNavigatedTo方法。根据[这个问题],在这里使用async void很好:1

public async void OnNavigatedTo(NavigationParameters parameters)
{
    await LoadDataTaskAsync();
}

LoadDataTaskAsync方法:

private async Task LoadDataTaskAsync()
{
    // ... Other code ...
    _evaLogger.Info("LoadDataTaskAsync()");
    await _remoteDataManager.requestChats();
}

public async Task requestChats()
{
    await _websocketManager.requestChats(); // Gets the requestChats implementation for the current platform (in my case UWP)
}

requestChats():

public async Task requestChats()
{
        using (DataWriter dataWriter = new DataWriter(messageWebsocket.OutputStream))
        {
            _evaLogger.Info("dataWriter initialized requestChats.");
            dataWriter.WriteString(WebsocketRequestFactory.Create(SocketEventsEnm.GET_CHATS));
            await SendData(dataWriter, "requestChats");
        }
    _evaLogger.Info("dataWriter disposed requestChats.");
}

最后,SendData()

private async Task SendData(DataWriter dataWriter, string method)
{
    try
    {
        _evaLogger.Info("Trying to send data... " + method);
        await dataWriter.StoreAsync(); // Exception is thrown here!!!
        _evaLogger.Info("Data was sent." + method);
    }
    catch (Exception e)
    {
        _evaLogger.Error(e.Message, e);
    }
}

这是我运行应用程序后我的日志文件的样子:

  

14.12.2016 15:36:33 - 信息:尝试登录(在线)...

     

14.12.2016 15:36:33 - 信息:WebsocketManager.Connect();

     

14.12.2016 15:36:33 - 信息:MessageWebSocket已打开

     

14.12.2016 15:36:33 - 信息:LoadDataTaskAsync()

     

14.12.2016 15:36:33 - 信息:dataWriter初始化了requestChats。

     

14.12.2016 15:36:33 - 信息:尝试发送数据... requestChats

     

14.12.2016 15:36:33 - 错误:在意外时间调用了一个方法。 (来自HRESULT的异常:0x8000000E)

     

14.12.2016 15:36:33 - 信息:dataWriter处理了requestChats。

     

14.12.2016 15:36:34 - 信息:Websocket已打开

     

14.12.2016 15:36:34 - 信息:登录(在线)!!!

日志文件看起来(除了例外)对我来说很好,一切都以正确的顺序执行。

再次,抱歉长代码。但是我觉得它可以在这个代码中无处不在,我删除了所有不必要的代码行,这些代码不会导致异常(这就是为什么我有这么多方法可能看起来很奇怪)。

编辑:

删除OnOpened事件后,大部分时间 。但我偶尔也会得到同样的例外。

这是堆栈跟踪:

Error: A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)
   at Windows.Storage.Streams.DataWriter.StoreAsync()
   at One.UWP.Websockets.WebsocketManager.<SendData>d__30.MoveNext()

0 个答案:

没有答案