Tôi đã nhìn thấy lỗi này trên các bài đăng khác, nhưng không phải cho tình huống chính xác này.MessageQueue Disposed More Than Once
Tôi có hai lớp học thực hiện tương tự với MessageQueue. Do đó, tôi tóm tắt việc tạo và xử lý hàng đợi cho một lớp trợ giúp. Tôi nhận được lỗi này và tôi không thể xem hàng đợi có thể được xử lý nhiều lần như thế nào.
Object 'MessageQueue' có thể được xử lý nhiều hơn một lần trong phương pháp 'MsmqHelper.DisposeQueue (MessageQueue)'
Trong một trong những lớp học, đây là cách hàng đợi được sử dụng:
private MessageQueue _messageQueue;
Sau đó, , trong constructor của lớp:
this._messageQueue = MsmqHelper.InitializeQueue();
Không phải là nó thực sự quan trọng, nhưng đối với sự hoàn chỉnh, đây là nơi mà các hàng đợi được sử dụng:
this._messageQueue.Send(workflowCreated);
Và đây là những phương pháp Vứt bỏ:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (disposing == false) { return; }
MsmqHelper.DisposeQueue(this._messageQueue);
}
Và đây là đoạn code trong lớp helper mà thực sự gọi Dispose():
public static void DisposeQueue(MessageQueue messageQueue)
{
if (messageQueue != null)
{
messageQueue.Close();
messageQueue.Dispose();
messageQueue = null;
}
}
ở đâu nó có thể cho hàng đợi được xử lý nhiều hơn một lần trong tình huống này?
** Chỉnh sửa **
Tôi nghĩ sẽ thật thú vị khi thêm nhận xét của tôi, trong cuộc trò chuyện bên dưới, tại đây. Đó là một bản tóm tắt tốt, cùng với câu trả lời được chấp nhận:
Tôi nghĩ mình đã hiểu ngay bây giờ. Tham số phương thức messageQueue không liên quan gì đến tham chiếu gốc (this._messageQueue) cho đối tượng. Vì vậy, kiểm tra messageQueue cho null, và thiết lập nó để null, không tốt. Người gọi vẫn có thể vượt qua trong biến của nó (this._messageQueue) ngay cả sau khi được xử lý. Do đó, có thể được xử lý nhiều hơn một lần.
Nhân tiện, thậm chí đặt biến của người gọi (this._messageQueue) thành null, trong phương thức gọi, không được trợ giúp. Vấn đề tồn tại chỉ trong MsmqHelper.DisposeQueue(). Vì vậy, câu trả lời là để vượt qua bởi ref hoặc đơn giản là không gọi DisposeQueue() và làm tất cả trong phương thức gọi.
** Chỉnh sửa 2 **
Sau khi thử điều này, tôi nhận được lỗi tương tự. Tôi chỉ đơn giản là không nhận được nó.
public static void DisposeQueue(ref MessageQueue messageQueue)
{
if (messageQueue == null) { return; }
messageQueue.Close();
messageQueue.Dispose();
messageQueue = null;
}
** Chỉnh sửa 3 - Lỗi? **
Tôi bắt đầu nghĩ rằng đây có thể là lỗi. Nếu tôi nhận xét messageQueue.Dispose(), lỗi sẽ biến mất. TUY NHIÊN, tôi có thể tin nhắn cuộc gọiQueue.Close() và messageQueue.Dispose() cùng nhau trong phương thức gọi. Đi con số. Tôi nghĩ rằng tôi sẽ thực hiện các cuộc gọi tương tự từ các phương thức gọi điện thoại hoặc chỉ gọi Close() hoặc Dispose() thay vì cả hai.
nơi được xác định phương thức 'public void Dispose() (bool disposing)'? – Tigran
Có thể là do 'Close' và' Dispose' thực hiện điều tương tự? –
@Lasse Đó là một suy nghĩ thú vị. Tôi đã nhận xét dòng Close() và nó được biên dịch. Sau đó, tôi uncommented dòng Close(), và nhận xét dòng Dispose() và nó vẫn được biên dịch. Vì vậy, những gì bạn nói có thể là câu trả lời. Tôi có thể thề rằng tôi có cả hai dòng (Close() và Dispose()) trong mã trước và nó đã hoạt động. Tôi vừa kiểm tra, và tôi đã làm. Bây giờ tôi không chắc phải nghĩ gì. –