WinRT API中是否有等效的Android Handler?

时间:2013-06-13 20:41:07

标签: multithreading windows-runtime windows-store-apps

Android提供了一个Handler类,可以在一个线程上串行运行任务(类型为RunnableMessage)。我试图在Windows应用商店应用中重现这种确切的行为,我看到的唯一的类是ThreadPoolThreadPoolTimer我相信它提供了对后台线程池的访问,但我想要的是访问一个后台主题。

如果使用WinRT API无法使用the allowed Win32 API's

所有这些麻烦的原因是我有一个旧的C ++库,只能在单个线程上运行,但我不想在UI线程上运行它,因为它可以阻止它。通常我会排队一堆任务来让库执行。 Android中的Handler非常适合这种情况。

2 个答案:

答案 0 :(得分:0)

这是我对Android处理程序的天真实现(至少我已经尽了最大努力):

public class Handler
{
    private static readonly BlockingCollection<Action> queue = new BlockingCollection<Action>();

    static void Loop()
    {
        while (true)
        {
            Action task = queue.Take();

            if (task == null) break;

            task();
        }
    }

    static Handler()
    {
        Thread thread = new Thread(Loop);
        thread.Name = "Handler";
        thread.Start();
    }

    public static void Post(Action task)
    {
        queue.Add(task);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Launching tasks");

        Handler.Post(() => { Console.WriteLine("Running task 1..."); Thread.Sleep(1000); Console.WriteLine("Task 1 done."); });
        Handler.Post(() => { Console.WriteLine("Running task 2..."); Thread.Sleep(3000); Console.WriteLine("Task 2 done."); });
        Handler.Post(() => { Console.WriteLine("Running task 3..."); Thread.Sleep(2000); Console.WriteLine("Task 3 done."); });
        Handler.Post(null);

        Console.WriteLine("Waiting end of tasks");
    }
}

它是否符合您的需求?

答案 1 :(得分:0)

据我所知,答案是否定的,WinRT没有Handler类或明显的替代品。

但是,我能够在C ++ / CX中编写一个复制大多数行为的WinRT类。我是使用Concurrency::concurrent_queue类和Windows::System::Threading::ThreadPool类完成的。基本上,我的WinRT Handler类公开了一个接受Windows::System::Threading::WorkItemHandlerWindows::Foundation::AsyncActionCompletedHandler的方法,并使用队列使用ThreadPool一次运行一个提交的工作项。工作项完成后,将调用AsyncActionCompletedHandler。 exposed方法返回一个自定义取消令牌对象,允许用户取消工作。如果没有正在运行的任务,则立即启动一个任务,否则将其添加到队列中,当一个任务完成时,它会查看队列并启动下一个队列(如果有的话)。