我处于需要在SAME THREAD上发生特定操作序列的情况,但操作是任务,Observables以及各种随机代码和方法调用的混合,包括尝试/抓住。踢球者都需要在同一个线程上执行。例如......你可以通过重写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正在制作观察者。我会做更多的调试......