- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在为 .NET 移植 AKKA 框架(现在不要太认真,现在是其中 Actor 部分的周末 hack)
我对其中的“Future”支持有一些问题。在 Java/Scala Akka 中,Future 将通过 Await 调用同步等待。很像 .NET Task.Wait()
我的目标是为此支持真正的异步等待。它现在可以正常工作,但在我当前的解决方案中,继续是在错误的线程上执行的。
这是向我的一位 Actor 传递消息时的结果,其中包含 future 的 await block 。如您所见,actor 始终在同一个线程上执行,而 await block 在随机线程池线程上执行。
actor thread: 6
await thread 10
actor thread: 6
await thread 12
actor thread: 6
actor thread: 6
await thread 13
...
参与者使用数据流获取消息 BufferBlock<Message>
或者更确切地说,我在缓冲区 block 上使用 RX 来订阅消息。它是这样配置的:
var messages = new BufferBlock<Message>()
{
BoundedCapacity = 100,
TaskScheduler = TaskScheduler.Default,
};
messages.AsObservable().Subscribe(this);
到目前为止一切顺利。
但是,当我等待 future 的结果时。像这样:
protected override void OnReceive(IMessage message)
{
....
var result = await Ask(logger, m);
// This is not executed on the same thread as the above code
result.Match()
.With<SomeMessage>(t => {
Console.WriteLine("await thread {0}",
System.Threading.Thread.CurrentThread.GetHashCode());
})
.Default(_ => Console.WriteLine("Unknown message"));
...
我知道这是 async await 的正常行为,但我真的必须确保只有一个线程可以访问我的 actor。
我不希望 future 同步运行,我想像平常一样运行异步,但我希望继续运行在与消息处理器/参与者相同的线程上。
我的 future 支持代码如下所示:
public Task<IMessage> Ask(ActorRef actor, IMessage message)
{
TaskCompletionSource<IMessage> result =
new TaskCompletionSource<IMessage>();
var future = Context.ActorOf<FutureActor>(name : Guid.NewGuid().ToString());
// once this object gets a response,
// we set the result for the task completion source
var futureActorRef = new FutureActorRef(result);
future.Tell(new SetRespondTo(), futureActorRef);
actor.Tell(message, future);
return result.Task;
}
有什么想法可以强制继续在启动上述代码的同一线程上运行吗?
最佳答案
I'm making a port of the AKKA framework for .NET
甜甜的。尽管我从未接触过 Java/Scala/Akka,但我参加了 CodeMash '13 的 Akka 演讲。我在那里看到了 .NET 库/框架的巨大潜力。微软is working on something similar ,我希望它最终会普遍可用(它是 currently in a limited preview )。
我怀疑尽可能多地停留在 Dataflow/Rx 世界是更简单的方法; async
最适用于异步操作(每个操作有一个开始和一个结果),而 Dataflow 和 Rx 更适合流和订阅(有一个开始和多个结果)。所以我的第一个直觉 react 是要么将缓冲区 block 链接到具有特定调度程序的 ActionBlock
,要么使用 ObserveOn
将 Rx 通知移动到特定调度程序,而不是尝试在 async
端完成。当然,我对 Akka API 设计不是很熟悉,所以对此持保留态度。
无论如何,我的async
intro描述了调度 await
延续的仅有的两个可靠选项:SynchronizationContext.Current
和 TaskScheduler.Current
。如果您的 Akka 端口更像是一个框架(您的代码在其中进行托管,而最终用户代码始终由您的代码执行),那么 SynchronizationContext
可能有意义.如果您的端口更像是一个库(最终用户代码在这里托管并根据需要调用您的代码),那么 TaskScheduler
会更有意义。
自定义 SynchronizationContext
的示例并不多,因为这种情况非常罕见。我有一个 AsyncContextThread
type在我的 AsyncEx library它为该线程定义了 SynchronizationContext
和 TaskScheduler
。有几个自定义 TaskScheduler
的示例,例如 Parallel Extensions Extras它有一个 STA scheduler和一个 "current thread" scheduler .
关于c# - 强制任务在当前线程上继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20868161/
我正在我的应用程序后台下载视频。如果用户在下载过程中重启了应用/设备,有什么方法可以在他们下次启动应用时从他们中断的地方继续下载? 最佳答案 这主要取决于文件服务器的配置(HTTP、FTP 等)。 现
我正在试验 WPF 动画,但有点卡住了。这是我需要做的: 鼠标悬停: 淡入(2 秒内从 0% 到 100% 不透明度) MouseOut: 暂停 2 秒 淡出(2 秒内从 100% 到 0% 不透明度
我的问题是这个线程的延续: Ant: copy the same fileset to multiple places 我是映射器的新手。有人(carej?)可以分享一个使用映射器来做到这一点的例子吗
继续previous question我希望能够显示一些事件指示器即使主线程被阻塞。(基于this article)。 基于所附代码的问题: 使用 Synchronize(PaintTargetWin
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度的了解。包括尝试的解决方案、为什么它们不起作用以及预期结果
我有一个场景,其中有一个线程在等待和执行任务之间循环。但是,我想中断线程的等待(如果愿意,可以跳过其余的等待)并继续执行任务。 有人知道如何做到这一点吗? 最佳答案 我认为你需要的是实现 wait()
这是我的代码架构: while (..) { for (...; ...;...) for(...;...;...) if ( )
import java.util.Scanner; public class InteractiveRectangle { public static void main(String[] args)
如何将 continue 放入具有函数的列表理解中? 下面的示例代码... import pandas as pd l = list(pd.Series([1,3,5,0,6,8])) def inv
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我正在用 python 开发一个程序,遇到了一个我不知道如何解决的问题。我的意图是使用 with 语句,避免使用 try/except。 到目前为止,我的想法是能够使用 continue 语句,就像在
我对下一段代码的执行感到困惑: label: for (int i = 0; i < 100; i++) { if (i % 2 == 0) c
这很好用: #include int main(){ volatile int abort_counter = 0; volatile int i = 0; while (i
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
如果不满足某些条件,我会尝试跳到循环的下一次迭代。问题是循环仍在继续。 我哪里出错了? 根据第一条评论更新了代码示例。 foreach ($this->routes as $route =>
如果不满足某些条件,我会尝试跳到循环的下一次迭代。问题是循环仍在继续。 我哪里出错了? 根据第一条评论更新了代码示例。 foreach ($this->routes as $route =>
Android项目中的一个需求:通过线程读取文件内容,并且可以控制线程的开始、暂停、继续,来控制读文件。在此记录下。 直接在主线程中,通过wait、notify、notifyAll去控制读文件的线
link text 我得到了引用计数的概念 所以当我执行“del astrd”时,引用计数降为零并且 astrd 被 gc 收集? 这是示例代码。这些代码是我在昨天的问题之后开发的:link text
我想首先检查我的 Range 是否有 #NA 错误,然后在退出宏之前显示包含错误的单元格地址。这是我到目前为止所做的。 现在,如果出现错误,我想显示 MsgBox警告用户错误并停止程序的其余部分执行,
while( (c = fgetc(stdin)) != EOF ){ count++; if (count == lineLen - 1){ moreChars =
我是一名优秀的程序员,十分优秀!