Reactive Extensions - остановка потока до заполнения переменной - PullRequest
1 голос
/ 28 июля 2011

У меня есть следующий код. Мой метод имеет строковый тип возврата.

public string GetRedemeptionNumber()
{

string _batchNumber = "test";
var _loadBatchName = Observable.ForkJoin(_context.QuerySingleOrDefault(
            _context.GetRedemptionsQuery().Where(x => x.ReceiveBatchName.StartsWith(_batchNumber))
            .OrderByDescending(x => x.ReceiveBatchName)
            .Take(1)))
            .Do(u => _redemptionBatch = u.FirstOrDefault())
                               .Select(x => new Unit())
                               .Finally(() =>
                               {
                                       _batchNumber = _redemptionBatch.Name;

                                      //this doesnt work since a return isnt allowed
                                       return _batchNumber;
                                   }
                               });

        _loadBatchName.Subscribe();


        return _batchNumber;
}

Моя проблема заключается в том, что она запускается и возвращает мой _batchNumber до того, как он будет установлен. поэтому он возвращает пустой _batchNumber. Есть ли способ остановить этот запуск до возврата (за пределами моего .finally) и подождать, пока _batchNumber будет заполнен из моего .finally.

Мой код явно не работает сейчас, так как мой .finally не разрешает возврат в нем.

1 Ответ

2 голосов
/ 28 июля 2011

У вашего кода есть несколько проблем.

Сначала, если вы хотите заблокировать, пока Rx не вернется, тогда использование Rx не имеет особого смысла.Это должно быть о том, чтобы не блокировать.Таким образом, вы должны действительно возвращать IObservable<string>, а не string.

Кроме того, чтобы в вашем запросе было OrderByDescending, вы должны использовать перечислимое, а не наблюдаемое, поэтому каким-то образом ваш запрос должен превратиться в наблюдаемый.

И ForkJoin, похоже, ничего не делает для вас в этом запросе.Почему вы его использовали?

Все операторы Do & Finally тоже не имеют особого смысла.

В любом случае, я не смог бы преобразовать ваш код в нечтоэто компилируется, но я получил это близко.Начните с этого и скажите, что нужно изменить.

public static IObservable<string> GetRedemeptionNumber()
{
    var _batchNumber = "test";

    var q =
        _context.GetRedemptionsQuery()
        .Where(x => x.ReceiveBatchName.StartsWith(_batchNumber))
        .OrderByDescending(x => x.ReceiveBatchName)
        .Take(1);

    return (from u in _context.QuerySingleOrDefault(q)
            from z in u
            select z.Name).Take(1);
}
...