具有多个参数和回调的特定线程上的Monotouch PerformSelector

时间:2015-11-07 11:00:14

标签: multithreading xamarin.ios nsthread performselector nsinvocation

我在使用单点触控线程时遇到了一些问题。我的应用程序使用我链接的外部库,它工作正常。由于应用程序和库的性质,我必须在一个单独的线程上进行所有调用。这些调用通常是:

  • 由用户引起的随机非确定性
  • 每t毫秒(约20毫秒)。像更新功能一样

读了一下后,我决定尝试 NSThread 。我已经设法通过将 NSTimer 附加到线程的 RunLoop 来调用Update函数,并且一切正常。我现在遇到的问题是在同一个线程上调用其他方法。我在某处读到 RunLoop 上的 PerformSelector 将选择器调用添加到 RunLoop的队列并在可用时调用它,这基本上就是我的意思需要。但是我需要调用的方法是:

  • 可以有多个参数
  • 有回调,我需要在主线程上调用,再次使用多个参数

对于多参数问题,我看到 NSInvocation 可以是一个解决方案,但是我的生活中我无法弄清楚如何使用monotouch进行操作并且没有找到任何相关的示例。

对于我需要对库进行的实际调用,我尝试了一种通用的方式,我可以通过特定线程上的委托调用我选择的任何函数,这种方式有效,直到我被多个命中使用多个参数再次参数和/或回调主线程。我是否应该为每个需要从库中调用的(包装)函数注册单独的选择器?

我不喜欢使用这种方法,如果我有更好的方式对它开放,那就是在搜索其他选项后我发现它们不适合我的情况:

  • GCD (甚至不确定我是否在monotouch中)在必要时自己生成线程。我需要一个特定的线程来安排我的工作
  • NSInvocationQueue (从我读到的内部使用GCD)做同样的事情。
  • pThreads ,看起来有点过分和管理它们会很痛苦(甚至不能确定我可以在monotouch中使用它们)

我不是iOS开发人员,该应用程序与monodroid工作正常,我有Runnables和Handlers,让生活更轻松:)。也许我没有以正确的方式看待这个问题,并且有一个简单的解决方案。任何意见都将不胜感激。

由于

更新

我正在考虑按照以下方式做点什么: 有一个简单的包装器:

class SelectorHandler : NSObject
{
    public static Selector Selector = new Selector("apply");

    private Action execute;

    public SelectorHandler(Action ex)
    {
        this.execute = ex;
    }

    [Register("apply")]
    private void Execute()
    {
        execute();
    }
}

延长NSThread

public class Daemon : NSThread
{
    public void Schedule(Action action)
    {
        SelectorHandler handler = new SelectorHandler(action);
        handler.PerformSelector(SelectorHandler.Selector, this, null, true);
    }
}

然后,当我想打电话时,我可以这样做:

private Daemon daemon;
public void Call_Library_With_Callback(float param, Action<int> callback)
{
    daemon.Schedule(() =>
    {
        int callbackResult = 0;
        //Native library calls
        //{
            // Assign callback result
        //}
        daemon.InvokeOnMainThread(() =>
        {
            callback(callbackResult);
        });
    });
}

0 个答案:

没有答案