- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我只想在异步方法中接收我的消息!它卡住了我的用户界面
public async void ProcessMessages()
{
MessageQueue MyMessageQueue = new MessageQueue(@".\private$\MyTransactionalQueue");
MyMessageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
while (true)
{
MessageQueueTransaction MessageQueueTransaction = new MessageQueueTransaction();
MessageQueueTransaction.Begin();
ContainError = false;
ProcessPanel.SetWaiting();
string Body = MyMessageQueue.Receive(MessageQueueTransaction).Body.ToString();
//Do some process with body string.
MessageQueueTransaction.Commit();
}
}
我只是像调用任何常规方法一样调用该方法,并且它没有工作!当我使用 BackgroundWorkers 而不是 async/await 时,这段代码曾经有效
想法?
最佳答案
正如 Stephen 所写,异步不会在线程中运行您的代码。幸运的是,您可以使用 TaskFactory.FromAsync与 MessageQueue.BeginReceive/MessageQueue.EndReceive 异步接收消息:
private async Task<Message> MyAsyncReceive()
{
MessageQueue queue=new MessageQueue();
...
var message=await Task.Factory.FromAsync<Message>(
queue.BeginReceive(),
queue.EndReceive);
return message;
}
您应该注意,没有使用事务的 BeginReceive 版本。来自 BeginReceive 的文档:
Do not use the asynchronous call BeginReceive with transactions. If you want to perform a transactional asynchronous operation, call BeginPeek, and put the transaction and the (synchronous) Receive method within the event handler you create for the peek operation.
这是有道理的,因为无法保证您必须等待响应多长时间或哪个线程最终会处理完成的调用。
要使用事务,您可以这样写:
private async Task<Message> MyAsyncReceive()
{
var queue=new MessageQueue();
var message=await Task.Factory.FromAsync<Message>(queue.BeginPeek(),queue.EndPeek);
using (var tx = new MessageQueueTransaction())
{
tx.Begin();
//Someone may have taken the last message, don't wait forever
//Use a smaller timeout if the queue is local
message=queue.Receive(TimeSpan.FromSeconds(1), tx);
//Process the results inside a transaction
tx.Commit();
}
return message;
}
更新
正如 Rob 指出的那样,原始代码使用了从 Peek
返回的 message
,这可能在 Peek
和 Receive 之间发生了变化
。在这种情况下,第二条消息将丢失。
不过,如果另一个客户端读取队列中的最后一条消息,仍然有可能发生阻塞。为防止这种情况,Receive
应该有一个小超时。
关于c# - MessageQueue 和异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16100773/
我在其他帖子上看到过这个错误,但不是针对这种情况。 我有两个类使用 MessageQueue 做同样的事情。因此,我将队列的创建和处理抽象为一个辅助类。我遇到了这个错误,而且我看不出如何多次处理队列。
我还有两个问题。1. 如何将消息队列名称作为命令行参数传递?例如我写道: char src[50] , dest[50]; strcpy(src , "/"); strcpy(dest , argv[
据我了解,如果 MessageQueue 中只有带有 future 时间戳的消息,则 MessageQueue 会阻塞 Looper 的循环直到那个时间到来。但如果 MessageQueue 完全为空
我一直在浏览有关消息队列的文档,但似乎找不到我正在寻找的信息。我想要完成的任务是在每次调用 MySQL 数据库过程时记录该过程的名称,以便跟踪每个过程的调用频率。我的想法是在调用时将名称记录到 Mes
我一直在查看处理来自 MSMQ 的消息的服务的示例代码。在代码中,在 ReceiveCompletedEventHandler 的开头立即调用 EndReceive() 方法,然后它开始实际处理消息的
我只想在异步方法中接收我的消息!它卡住了我的用户界面 public async void ProcessMessages() { MessageQueue MyMess
我目前有一个后台线程。在这个线程中是一个无限循环。 这个循环偶尔更新数据库中的一些值,然后在 MessageQueue 上监听 1 秒(使用 queue.Receive(TimeSpan.FromSe
我用 C# 编写的应用程序使用 .NET 中的 MessageQueue 类与另一个远程应用程序进行消息通信,MessageQueue 应始终与远程 messageQueue 在所有情况下“连接”(存
我想先将一个类添加到 MessageQueue 的 MessageContent,然后再将其添加到 QueueStorage。 示例 class udpates { public int us
我正在调试 Android 框架,Handler 处理消息的速度很慢,所以我也许应该检查 Handler 的 MessageQueue 以查看消息是否具有低优先级或队列太长。 我查看了 Handler
我在使用基本的 Microsoft Message Queue 实现时遇到以下问题: 在读取端,消息的 Formatter 属性始终为 null,无论我在发送端输入什么。 发送代码: System.M
我发布这个问题是因为我想知道我对基础知识的想法是否正确。 应该清楚的是,UI-Thread 包含一个 MessageQueue,它与一个 Looper 相关联,以从队列中获取消息/可运行对象以进行处理
我已取消选择在专用队列上发送消息的权限,但 MessageQueue.CanWrite 从未返回 false。我可以切换接收消息权限,并且 CanRead 属性会按预期响应。为什么 CanWrite
我想在 MSMQ 消息队列上使用 Linq。据我所知,我需要将消息队列转换为 IEnumerable Howerver var queryableQ = new MessageQueue(myQueu
我正在使用 PeekCompleted 从 MessageQueue 中读取消息,我在这里执行我的过程,如果一切正常,我需要将其从队列中删除!目前我正在使用 MyMessageQueue.Receiv
我使用以下代码发送消息: var transaction = new MessageQueueTransaction()) transaction.Begin( ); var message = n
这个问题在这里已经有了答案: 关闭 13 年前。 Possible Duplicate: Java and MSMQ 我有一个由另一个组编写的 windows/C# 进程,它将 xml 格式的消息泵
我正在使用 Philip Semanchunk 的 posix_ipc python 模块从 posix 消息队列中读取数据。我编写的 C++ 程序使用包含数据的结构填充队列。我的 python 程序
我目前遇到丢失消息的问题。此错误很少发生,但经常发生,足以令人厌烦。以下是问题的背景: 我已经在 goldmine_service_queue 上打开了消息日志,它是 Windows 2003 服务器
我如何判断一个远程消息队列exists ?文档指出“存在”方法不适用于远程机器。 以下无效(我知道队列路径是准确的,因为我能够将消息发送到队列): if (!MessageQueue.Exists(@
我是一名优秀的程序员,十分优秀!