如何确保任务,Observables和Method调用的混合都在同一个线程上执行

时间:2017-08-11 20:30:26

标签: c# multithreading task-parallel-library system.reactive akavache

我处于需要在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正在制作观察者。我会做更多的调试......

0 个答案:

没有答案