2012-08-27 36 views
5

Tôi đang sử dụng thành phần của bên thứ ba chấp nhận dữ liệu tối đa 25KB tại một thời điểm. Tôi đang chuyển mảng các đối tượng đến thành phần bên thứ ba này từ ứng dụng của tôi.Điều chỉnh dữ liệu C#

Tuy nhiên, lượng dữ liệu mà ứng dụng của tôi viết lớn hơn 25KB. Tôi đang lấy dữ liệu từ cơ sở dữ liệu và gọi trực tiếp thành phần đó.

Tôi đã thêm tham chiếu của thành phần trong ứng dụng. Dữ liệu tôi đang chuyển đến thành phần là mảng đối tượng chứa các kiểu nguyên thủy và không nguyên thủy.

Làm cách nào để triển khai điều chỉnh dữ liệu tại đây?

+2

Vui lòng thêm một số thông tin khác, chẳng hạn như dữ liệu được gửi đến thành phần như thế nào, nghĩa là loại thông tin đó là gì. –

+1

Kiến trúc và phương pháp giao tiếp là gì? – ChrisBint

+0

Loại đối tượng nào bạn lưu trữ trong mảng, nguyên thủy? –

Trả lời

5

Bạn có thể tính toán kích thước của một hàng trong cơ sở dữ liệu của mình. Sau đó, mỗi khi bạn truyền một cái gì đó bạn thêm kích thước đó vào một biến. Đồng thời bạn đang sử dụng Đồng hồ bấm giờ chạy. Chỉ cần kiểm tra xem Stopwatch.EllapsedSeconds có lớn hơn 1 giây hay không. Nếu có đặt lại Đồng hồ bấm giờ và đặt lại biến của bạn với kích thước bạn đã vượt qua. Nếu không kiểm tra nếu kích thước bạn đã vượt qua (số lượng biến) lớn hơn 25KB. Nếu đó là sự thật, hãy gọi System.Thread.Thread.Sleep(Math.Max(1000 - StopWatch.EllapsedMilliseconds, 0)). Nhưng hãy nhớ rằng bạn phải làm điều đó trong một chuỗi phụ vì giấc ngủ chặn toàn bộ chuỗi.

3

Bạn phải triển khai bộ đệm dữ liệu giữa ứng dụng và thành phần của mình. Cách tốt nhất để làm điều đó là:

  • làm cho một lớp học có riêng của nó chủ đề nội bộ,
  • trên một phần nào của giao diện lớp thực hiện phương thức Write mà chấp nhận một mảng byte và lưu trữ nó vào một hàng đợi
  • chuỗi nội bộ ghi tối đa 25kb dữ liệu từ hàng đợi và ngủ trong 1 giây, trừ đi thời gian cần để viết đoạn văn.

Bạn cũng phải cẩn thận, nếu luồng dữ liệu liên tục và được tạo ở tốc độ> 25kbps, thì bạn tạo ra nhiều hơn thì thành phần có thể tiêu thụ và hàng đợi của bạn sẽ tràn.

2

Hãy xem ví dụ về lớp BufferedStream trong MSDN. Bạn sẽ có thể thích ứng với nó để bạn viết tối đa 25KB mỗi giây.

Khi ghi vào luồng, bạn chỉ định kích thước dữ liệu để đọc/ghi, vì vậy nếu bạn viết 25KB và trả về 24KB, bạn biết bạn vẫn có thể viết 1K.

Nếu nó trở lại với 25KB và vẫn còn dư thừa dữ liệu trong bộ đệm, bạn có thể thực hiện Thread.Sleep(1000) để đảm bảo nó không vượt quá hạn ngạch.

Các vấn đề liên quan