我的情况:我正在登录我的应用。登录后,将加载聊天(它是聊天应用程序)。我试图使用DataWriter.StoreAsync
,但它总会抛出此异常:
在意外时间调用了一个方法。 (HRESULT的例外情况: 0x8000000E)
我在过去几天里已经阅读了很多关于异步代码的内容,而且我在这个例外中遇到了很多困难。我(相信)知道的事情:
await
,否则我的代码不会等待返回并抛出异常async void
,因为它不会返回(只有例外:事件)DataWriter
以确保使用相同的DataWriter
不幸的是,我的代码仍然抛出上述异常。也许我忘记了某些事情或了解了async
错误的内容。
由于我正在使用服务器,因此我无法提供示例项目。抱歉!代码墙现在传入,抱歉,但我的错误可能在此代码的任何地方。代码按从上到下执行的时间排序:
LoginCommand
中MainPageViewModel
的实例:
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
不允许Task
而DelegateCommand.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()