【发布时间】:2016-05-15 22:58:45
【问题描述】:
我有一个系统,其中所有数据库操作 (SQLite) 必须通过使用工作处理器来运行,因此我可以随意安排它们。
现在处理器有一个Task<TResult> PostAsync<TResult>(Func<SQLiteConnection, TResult> dbFunc),但我能想出的唯一理智的实现是一个基于堆栈的 UI 线程工作循环,它利用Task 能够将结果推迟到处理实际操作的那一刻。
它工作正常,但它用 SQLite 调用阻塞了 UI 线程。我宁愿不发生这种情况,但我能想出的唯一想法是产生一个工作线程来刷新队列或为每个操作提供它自己的工作线程。我认为这两种方法都不是最明智的方法,因为它们最终会在每次需要访问数据库时创建线程。
如何实现堆栈中的dbFunc 参数在后台线程中执行但所述线程只创建一次或尽可能轻量级的实现?
这必须在 Xamarin 环境中工作。在 PCL 或 Android+iOS 实现中。
【问题讨论】:
-
就多线程而言,我认为 .NET PCL 中没有任何东西支持启动另一个线程。
System.ComponentModel不包含BackgroundWorker类。System.Threading命名空间不包含Thread类。使用其中任何一个,您都可以构建一个队列(我已经做过很多次了。但它依赖于Thread类)。异步任务可能是您在 PCL 中可以获得的最好的任务。这个 SO 线程似乎证实了:stackoverflow.com/questions/9251917/… -
我没有提到我可以摆脱 Android+iOS 平台特定的工作接口实现。
-
看来您的
PostAsync参数应该是Func<SQLiteConnection, TResult>,而不是相反。 -
@KirillShlenskiy 不错。固定。
标签: c# multithreading xamarin