Android提供了一个Handler
类,可以在一个线程上串行运行任务(类型为Runnable
或Message
)。我试图在Windows应用商店应用中重现这种确切的行为,我看到的唯一的类是ThreadPool
和ThreadPoolTimer
我相信它提供了对后台线程池的访问,但我想要的是访问一个后台主题。
如果使用WinRT API无法使用the allowed Win32 API's?
所有这些麻烦的原因是我有一个旧的C ++库,只能在单个线程上运行,但我不想在UI线程上运行它,因为它可以阻止它。通常我会排队一堆任务来让库执行。 Android中的Handler
非常适合这种情况。
答案 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::WorkItemHandler
和Windows::Foundation::AsyncActionCompletedHandler
的方法,并使用队列使用ThreadPool
一次运行一个提交的工作项。工作项完成后,将调用AsyncActionCompletedHandler
。 exposed方法返回一个自定义取消令牌对象,允许用户取消工作。如果没有正在运行的任务,则立即启动一个任务,否则将其添加到队列中,当一个任务完成时,它会查看队列并启动下一个队列(如果有的话)。