0

我的情况是,我需要在同一线程上发生特定的操作序列,但这些操作是任务、可观察对象以及各种随机代码和方法调用(包括 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。我会再做一些调试...

4

0 回答 0