Windows Phone 8.1 HTTP Stream Deadlock
本文关键字:Stream Deadlock HTTP Phone Windows | 更新日期: 2023-09-27 18:08:39
以下代码适用于windows Phone 8.0,但在
上发生死锁int nextByte = stream.ReadByte();
/// <summary>
/// Performs a query on the Twitter Stream.
/// </summary>
/// <param name="request">Request with url endpoint and all query parameters.</param>
/// <returns>
/// Caller expects an JSON formatted string response, but
/// real response(s) with streams is fed to the callback.
/// </returns>
public async Task<string> QueryTwitterStreamAsync(Request request)
{
WriteLog(request.FullUrl, "QueryTwitterStreamAsync");
var handler = new HttpClientHandler();
if (Authorizer.Proxy != null && handler.SupportsProxy)
handler.Proxy = Authorizer.Proxy;
using (StreamingClient = new HttpClient(handler))
{
StreamingClient.Timeout = TimeSpan.FromMilliseconds(System.Threading.Timeout.Infinite);
var httpRequest = new HttpRequestMessage(HttpMethod.Post, request.Endpoint);
var parameters =
string.Join("&",
(from parm in request.RequestParameters
select parm.Name + "=" + Url.PercentEncode(parm.Value))
.ToList());
var content = new StringContent(parameters, Encoding.UTF8, "application/x-www-form-urlencoded");
httpRequest.Content = content;
var parms = request.RequestParameters
.ToDictionary(
key => key.Name,
val => val.Value);
SetAuthorizationHeader(HttpMethod.Post, request.FullUrl, parms, httpRequest);
httpRequest.Headers.Add("User-Agent", UserAgent);
httpRequest.Headers.ExpectContinue = false;
if (Authorizer.SupportsCompression)
httpRequest.Headers.AcceptEncoding.TryParseAdd("gzip");
var response = await StreamingClient.SendAsync(
httpRequest, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);
await TwitterErrorHandler.ThrowIfErrorAsync(response).ConfigureAwait(false);
Stream stream = await CreateStream(response);
const int CarriageReturn = 0x0D;
const int LineFeed = 0x0A;
var memStr = new MemoryStream();
while (stream.CanRead && !IsStreamClosed)
{
**int nextByte = stream.ReadByte();**
if (nextByte == -1) break;
if (nextByte != CarriageReturn && nextByte != LineFeed)
memStr.WriteByte((byte)nextByte);
if (nextByte == LineFeed)
{
int byteCount = (int)memStr.Length;
byte[] tweetBytes = new byte[byteCount];
memStr.Position = 0;
await memStr.ReadAsync(tweetBytes, 0, byteCount).ConfigureAwait(false);
string tweet = Encoding.UTF8.GetString(tweetBytes, 0, byteCount);
var strmContent = new StreamContent(this, tweet);
await StreamingCallbackAsync(strmContent).ConfigureAwait(false);
memStr.Dispose();
memStr = new MemoryStream();
}
}
}
IsStreamClosed = false;
return "{}";
}
async Task<Stream> CreateStream(HttpResponseMessage response)
{
var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
if (Authorizer.SupportsCompression)
return new GZipStream(stream, CompressionMode.Decompress);
else
return stream;
}
这是来自我的开源项目,LINQ to Twitter,在:
http://linqtotwitter.codeplex.com/SourceControl/latest LinqToTwitterPcl/LinqToTwitter TwitterExecute.cs
这不再是一个问题,并且在很大程度上由事件(OBE)接管。我不再以Windows 8.1的流媒体支持为目标,而是转向了Windows 10,它引入了新的Windows. web . http . httpclient。使用新的HttpClient,流式传输在我所有的模拟器和Windows 10设备上都可以完美地工作。