-2

在 get set 属性中,只有在设置了值之后才返回值。我使用了响应式库并订阅了它在不同线程上运行的消息。当引发事件并设置值时,捕获值并返回。

 internal PinMessage()
        {
            obj.PinsAvailable.ObserveOn(SynchronizationContext.Current).Subscribe(HandlePinsAvailable);
        }      

        private void HandlePinsAvailable(byte[] pinBytes)
        {
           pinmesssage = Encoding.ASCII.GetString(pinBytes);           
        }

        public void Readvalue(object stringobj)
        {
            pinmesssage = (string)stringobj;
        }

        internal string GetPinMessage(string AccoutNumber)
        {
            string pinstring = string.Empty;
            obj.SendPinRequest(AccoutNumber);
            t1.Join();
            pinstring = pinmesssage;
            return pinstring;
        }

        private string _pinMessafe;

        public string pinmesssage
        {
            get
            {
//Get value only when the property is set
                return _pinMessafe;
            }
            set { _pinMessafe = value; }
        }
4

2 回答 2

0

你在这里混合了很多东西。当您使用 Rx 时,您不会尝试通过执行线程连接来编组线程。您无需进出 Rx 代码。

您的代码应该看起来像这样:

internal IObservable<string> GetPinMessage(string AccoutNumber)
{
    return Observable
        .Start(() => obj.SendPinRequest(AccoutNumber))
        .Select(pinBytes => Encoding.ASCII.GetString(pinBytes))
        .ObserveOn(SynchronizationContext.Current);
}

我假设这SendPinRequest是一个同步请求。Rx 会为你把它变成一个单值异步 observable。

于 2013-09-05T00:15:07.517 回答
0

如果你想等待另一个线程设置一个值,你可以使用TaskCompletionSource

您在某处创建一个 TaskCompletionSource

TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();

在产生你所做的价值的线程上

tcs.SetResult("some string message");

在线程上等待你做的结果

string message = tcs.Task.Result; // Will block the current thread

或者更好地在异步方法中使用异步等待模式

string message = await tcs.Task

但是,如果您真的在使用Reactive Extensions那么您可能应该将它用于整个管道而不是上述模式。你可能应该写

string message = await MessageSource().Take(1);

MessageSource 将具有签名的位置

IObservable<string> MessageSource();
于 2013-08-23T05:07:15.170 回答