經過對StackOverflow的大量工作和研究 - 其中大部分已經過時,因爲Reactive Extensions代碼最近發生了變化 - 我終於可以消除從此Observable方法讀取數據的所有編譯錯誤一個套接字,並且我比起初我更瞭解這個代碼。但並不完全。是否有人可以用英語將此回讀給我,並回答兩三個問題?閱讀Observable TAP模式
從這個方法中提取緩衝數據(或者如果我錯了,它應該是多少)?是否有部分不再需要?儘管我真的很喜歡從我的業務代碼中解耦,並且只用一兩種方法保留所有套接字代碼,但有沒有更好的方法來做到這一點(解耦和可讀)?
public static IObservable<int> WhenDataReceived(this Socket socket, int byteCount, SocketFlags flags = SocketFlags.None)
{
Contract.Requires(byteCount > 0);
return Observable.Create<int>(
observer =>
{
byte[] buffer = new byte[byteCount];
int remainder = byteCount;
bool shutdown = false;
return Observable.Defer<int>(() =>
Task.Factory.FromAsync<int>(socket.BeginReceive(buffer, buffer.Length - remainder, remainder, flags,
(result) =>
{
var read = (int)result.AsyncState;
remainder -= read;
if (read == 0)
shutdown = true;
},
null), socket.EndReceive).ToObservable())
.TakeWhile(_ => remainder > 0 && !shutdown)
.TakeLast(1)
.Subscribe(
observer.OnNext,
ex =>
{
var socketError = ex as SocketException;
if (socketError != null
&& (socketError.SocketErrorCode == SocketError.Disconnecting
|| socketError.SocketErrorCode == SocketError.Shutdown))
{
observer.OnCompleted();
}
else { observer.OnError(ex); }
},
observer.OnCompleted);
});
}
}
調用它仍然有編譯錯誤我不明白(。做和.BitConverter有一些無效參數)功能:
static IObservable<string> StartClient(this IObserver<ScanInformation> observer, IPAddress ip, int port)
{
var client = Observable.Using(
() => new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp),
socket =>
from _ in socket.WhenConnected(ip, port)
from message in
(from first in socket.WhenDataReceived(4)
let length = BitConverter.ToInt32(first, 0)
from message in
Observable.If(
condition:() => length > 0,
thenSource: from second in socket.WhenDataReceived(length)
select Encoding.UTF8.GetString(second, 0, length),
elseSource: Observable.Return<string>(null))
select message)
.Repeat()
.TakeWhile(message => message != null)
select message);
return
client.Do(observer).TakeLast(1);
}
請發佈您的編譯錯誤。 – bradgonesurfing
錯誤15'System.IObservable'不包含'Do'的定義和最佳擴展方法重載'System.Reactive.Linq.Observable.Do (System.IObservable ,System.Action )'有一些無效參數 –
shipr
...和... 錯誤13'System.BitConverter.ToInt32(byte [],int)'的最佳重載方法匹配有一些無效參數 – shipr