C# Windows Phone 8.1 HTTP流死锁
以下代码适用于Windows Phone 8.0,但在Windows Phone 8.0上会死锁C# Windows Phone 8.1 HTTP流死锁,c#,asynchronous,windows-phone-8.1,linq-to-twitter,C#,Asynchronous,Windows Phone 8.1,Linq To Twitter,以下代码适用于Windows Phone 8.0,但在Windows Phone 8.0上会死锁 int nextByte = stream.ReadByte(); 在Windows Phone 8.1中: /// <summary> /// Performs a query on the Twitter Stream. /// </summary> /// <param name="request">Request with
int nextByte = stream.ReadByte();
在Windows Phone 8.1中:
/// <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,网址:
这不再是一个问题,主要由OBE事件接管。我不再把Windows8.1作为流媒体支持的目标,而是转向Windows10,它引入了一种新的技术。使用新的HttpClient,流媒体可以在我的所有模拟器和Windows 10设备上完美运行。检查您是否没有面临缓存问题。在整个文件被下载之前,我无法读取一个字节。