我想停止一种方法,直到自定义代表在xamarin.android中提供从一种方法到另一个方法的回调,但是我很难理解实现的实现。这样的听众。
我只试图了解如何做到这一点,但是我一直坚持如何构建和称为代表。
假设我希望这种主动方法停止
public async override void OnWindowFocusChanged(bool hasFocus)
{
base.OnWindowFocusChanged(hasFocus);
//how can I create a listener to stop this method until callback from OnPause?
//await a delegate task?
}
等待片段中的另一种方法:
public override void OnResume()
{
base.OnResume();
//I'd like to implement a delegate here to notify the OnWindowFocusChanged that OnResume method has been invoked
//what would be the construction of such?
}
我该怎么做?
从我的研究中,我相信我需要创建一个委托任务,然后等待它在OnwindowFocuschanged中的返回。但是,我对这种解决方案的实施感到困惑。如果有人甚至提供一个非常基本的伪代码示例,它将对我有很大帮助。
编辑:我将Onprope更改为Onresume,因为这对于理解我要做的事情更有用。以下答案参考文献Onpause,但无论如何这两种方法都是极其相似的方法。
这是一个例子,几乎做我要做的事情;除了调用Onresume时,除非启动我的方法,否则OnWindowFocuschanged Stop持续了10000ms。因此,基本上,我想用自定义委托(类似于事件(任务替换计时器,该任务在fragment.Onresume被调用时返回。
。 public async override void OnWindowFocusChanged(bool hasFocus)
{
base.OnWindowFocusChanged(hasFocus);
//we won't pass this line for 10000ms; how to replace with Task return?
await WaitHere();
}
async Task WaitHere()
{
System.Threading.Thread.Sleep(10000);
}
您可以尝试使用Task.Run
方法:
await Task.Run(() => OnPause());
这基本上会创建一个新线程或使用您所在的线程,并在此行之后安排所有内容作为延续。因此,是的,该方法会有点停止,但是除非您在某些GUI线程(不阻止(或运行某些IO任务,否则这是不必要的。
我并不真正了解您要实现的目标,但是您可能会尝试创建新的OnPauseasync方法,该方法将返回任务以从该方法完成后从该方法中获得一些结果。这样,您会像无法阻止的机制一样获得顺序。
如果您想真正并行运行这些方法,但是停止执行OnWindowFocusChanged
unitl OnPause
中的某些hapens,则应使用裸线和某些同步原始词,例如mutex或barrier。然后,您将能够使"主"线程等到发生某些事情(但会阻止!(。关于那些小伙子,您可以在此处阅读更多:link_with_focus_on_barrier
我不确定自己的意图是否正确,但我希望它最终对您有所帮助。
评论:
- 如果您只想等待Onpause的完成,并且它只能进行CPU重重的事情,并且您不在UI线程上 - 不要做任何事情,因为使用线程等没有利润。
如果Onpause会做一些可以使用的重量:
- 任务 - 可能在一个线程上执行并且不阻止,在
onPause
完全完成后将控制返回到OnWindowFocusChanged
。 - 线程 - 如果要运行一些并行的(保证两个线程(计算,并等待
onPause
在执行某个执行点向其呼叫者发出信号,您可以使用E.G屏障 - 但要当心,因为这是最多的从程序员的角度来看,复杂的解决方案,如果您在UI线程上,它会阻止它。
- 任务 - 可能在一个线程上执行并且不阻止,在