2014-10-01 90 views
1

在我的WPF應用程序中使用MVVM Light Messenger,並且某些功能無法按預期工作。MVVM Light Messeging問題

我的視圖模型用令牌註冊。即時通訊使用'長'對象作爲標記。 我的代碼例如用令牌5註冊,然後將請求發送到服務。 當服務回覆它在我的第二個視圖模型中處理,然後它將發送具有相同標記的消息。

當我調試和打印註冊和發送的消息似乎確定,但由於某種原因並不是所有的信使都收到註冊。

我的登記和處理如下所示:

private void registerTest() 
{ 
    long tokenId = getNextToken(); 
    ExtraData data = new ExtraData(); 
    Messenger.Default.Register<MyMsg>(this, tokenId, (m) => recieve(m,data)); 
} 

private void receive(MyMsg m,ExtraData data) 
{ 
    Messenger.Default.Unregister<MyMsg>(this, m.tokenId); 
} 

我發送如下所示:

private void sendTest(long tokenId) 
{ 
    Messenger.Default.Send(new MyMsg(tokenId), tokenId); 
} 

我總是它在我的sendTest, 收到過,但出於某種原因與令牌X註冊,有時當sendTest(X)被調用時,它沒有被接收。

任何人有任何想法發生了什麼?

+0

你班上的其他人看起來像什麼?你如何注入信使? – 2014-10-01 12:39:01

+0

問題似乎是在lambda中的動作,當不使用lambda中的局部變量時,這將工作。我在這裏找到一個相關的例子[鏈接](http://stackoverflow.com/questions/22613828/strange-behavior-with-actions-local-variables-and-garbage-collection-in-mvvm-li) – 2014-10-01 12:55:48

+0

哦!我想我明白你在說什麼...... – 2014-10-01 13:37:12

回答

0

您應該將自己的ExtraData作爲消息的類屬性,以便能夠與來自不同來源的消息進行交互。

public class MyMsg { 
    public int TokenId {get;set;} 
    public ExtraData Data {get;set;} 
} 


public void registerTest() 
{ 
    Messenger.Default.Register<MyMsg>(this, recieve); 
} 

public void recieve(MyMsg myMsg) 
{ 
    Messenger.Default.Unregister<MyMsg>(this, myMsg.TokenId); 
    //Note that you can also access m.Data here if you need to 
} 


public void sendTest() 
{ 
    var myMsg = new MyMsg {TokenId = GetNextToken(), Data = new ExtraData()}; 
    Messenger.Default.Send(myMsg); 
} 
+0

我只是做了一個很大的編輯,因爲在堆棧中編輯器中編寫代碼時存在一些問題。 – 2014-10-01 13:52:31