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

Windows Phone 8.1 HTTP Stream Deadlock

这不再是一个问题,并且在很大程度上由事件(OBE)接管。我不再以Windows 8.1的流媒体支持为目标,而是转向了Windows 10,它引入了新的Windows. web . http . httpclient。使用新的HttpClient,流式传输在我所有的模拟器和Windows 10设备上都可以完美地工作。