2015-12-14 153 views
0

我對C#比較陌生。我有一些麻煩從回調中返回值。 我有一個像結構:C#從回調函數返回異步參數

struct Params 
{ 
    ... 
    XXX[] xxx; 
} 

和被調用的回調函數,每當某些XXX數據準備:

void Callback(object response, object param) 
{ 
    var data = (Params)param; 
    data.xxx = (XXX[])response; 
    // signal 
} 

這是用這樣的:

Param param = new Param(); 
... 
MakeRequest(Callback, param); 
... 

內回調data.xxx有正確的值,但是(我得到一個信號,數據已準備就緒)無論我通過槽「參數」回調有xxx成員設置爲空。

什麼是返回一個像這樣的價值的最好方法是什麼?

+1

你寫的程序,但沒有給我們實際可用的代碼。 –

+0

我想要在MakeRequest上使用的參數。這應該是我認爲足夠的代碼。 – user1032861

回答

1

您已經聲明回調的範圍內的「數據」變量。回調在大多數情況下不會在它們被調用的同一個線程中調用(在很多平臺中,不僅僅是.NET),所以CLR可能無法保證本地內部「回調」的價值。

你可以做什麼,只要你可以改變回調的簽名,是使其靜態的,因此對於數據變量 - 也是靜態的。一個很好的例子可以在MSDN的以下鏈接中找到: https://msdn.microsoft.com/en-us/library/bbx2eya8(v=vs.110).aspx

您不需要閱讀整篇文章 - 只需滾動到底部 - 請參閱名爲「private static void ReceiveCallback(IAsyncResult ar)「並引用其中的變量」receiveDone「,假定它是靜態的。

+0

使用全局變量看起來不太優雅。我用它作爲「佔位符」。此外,它可能會產生額外的問題,我仍然不確定這件事上的訪問模式是什麼。應該有一種方法來發送某種安全指針......「將數據放在這裏」。對? – user1032861

+0

將對象列表傳遞給回調函數,並將創建的數組添加到該列表中。但是應該有一個特定的課程,不是嗎? – user1032861

+0

您可以在此命名空間上找到容器類: System.Collections.Generic例如列表,隊列,詞典等。 –

0

我認爲像...

class Container 
{ 
    public object container; 
} 

struct Params 
{ 
    ... 
    Container xxx; 
} 

Params params = new Params(); 
params.xxx = new Container(); 

void Callback(object response, object param) 
{ 
    var data = (Params)param; 
    data.xxx.container = (XXX[])response; 
    // signal 
} 

...解決它。註釋?

編輯:意識到,這只是一個passtrough。真正的代碼對結果做了些什麼。