创建一个侦听器以停止方法,直到自定义回调完成为止



我想停止一种方法,直到自定义代表在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线程上,它会阻止它。

最新更新