使用Web服务进行连续上载的最佳方式

时间:2013-11-20 19:32:55

标签: c# web-services

之前我问了一个类似的问题,我用过的答案在这种不同的情况下不起作用。

我有一个winform桌面c#app。

在计时器内(间隔100毫秒)我将位图转换为字节数组。

我每个时间段有一个10位图的流

然后将这些字节上传到服务器。

处理此问题的服务器没有问题。

在客户端,我使用async mehthods来使用[web服务]。

我正在检查在上述呼叫完成之前无法再次调用[web服务]的情况。

如果服务器没有及时响应,则“跳过”帧/图像。

这是我的客户代码:

     public void Init()
        {
            _live.StreamerCompleted += new wsLive.StreamerCompletedEventHandler(_live_StreamerCompleted);
        }

        private void _live_StreamerCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            _uploaded = true;
        }

 private static bool _uploaded = true;
private static wsLive.Live _live = new wsLive.Live();
  private static byte[] imageToByteArray(Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            imageIn.Dispose();
            return ms.ToArray();
        }
  public static void AddFrame(Image<Bgr, Byte> _newFrame)
        {
            if (_newFrame != null && _uploaded)
            {
                byte[] _data = GetDeflated(_newFrame.Copy());
                _live.StreamerAsync(Shared.Alias, _data, Guid.NewGuid().ToString());
                _newFrame.Dispose();
            }
        }

        public static void AddFrame(Bitmap _newFrame)
        {
            byte[] _data = imageToByteArray(_newFrame);
            _live.StreamerAsync(Shared.Alias, _data, Guid.NewGuid().ToString());
            _newFrame.Dispose();
        }

    //declared at form load
    Init();

    //inside my timer...
    if (Uploaded)
    {
    LiveStreaming.AddFrame((Bitmap)_currentFrame.Clone());
    }
    _currentFrame.dispose();

但记忆力攀升。我这样做了吗?

感谢

1 个答案:

答案 0 :(得分:2)

跳出来的一个问题是你没有在imageToByteArray中处理MemoryStream。

试试这个:

  private static byte[] imageToByteArray(Image imageIn)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            imageIn.Dispose();
            return ms.ToArray();
        }
    }