我的情况是,我需要在同一线程上发生特定的操作序列,但这些操作是任务、可观察对象以及各种随机代码和方法调用(包括 try/catch)的混合。踢球者是这一切都需要在同一个线程上执行。例如...你能通过重写 ExampleSequence 方法来解决这个问题吗?:
void SomeVoidMethod() { /* misc logic here */ }
void SomeOtherVoidMethod() { /* misc logic here */ }
void SomeExceptionHandlingMethod() { /* misc logic here */ }
IObservable<int> SomeObservableProducingMethod()
{
/* something interesting here */
return Observable.Return(3);
}
IObservable<Unit> SomeOtherObservableProducingMethod()
{
/* something interesting here */
return Observable.Return(Unit.Default);
}
async Task ExampleSequence(Task someTask)
{
try
{
SomeVoidMethod();
await someTask;
var val = await SomeObservableProducingMethod().ToTask();
if (val > 0)
await SomeObservableProducingMethod().ToTask();
SomeOtherVoidMethod();
}
catch (Exception)
{
SomeExceptionHandlingMethod();
}
}
编辑:根本问题是什么(您可能想知道)?我对可以更改的现有代码有一些限制,现在在处理 SQlite 数据库时,一旦我尝试将操作包装在事务中,第二个数据库操作就会失败(它永远不会返回)。我的假设是这是一个线程锁定问题,因为 SQlite 有非常基本的方法来锁定数据库以进行事务......
EDIT2:根据@Nksoi 在评论中的链接,https: //stackoverflow.com/a/24195827/1735721,我尝试使用 AsyncLock。这并没有解决问题,但我发现这是第一个等待的 Observable,最终永远等待。因此,在上面的示例中,它将是这一行:
var val = await SomeObservableProducingMethod().ToTask();
是否应该将某些内容传递给 Reactive Extension observable 或 ToTask 扩展方法以提高线程一致性?此外,现在认为可能是 Akavache 库 ( https://github.com/akavache/Akavache ) 中的某些东西导致了问题。Akavache 正在制作 observables。我会再做一些调试...