[英]How do I Use other functions from a different class in Asynchronous methods
我對Asynchronous並不陌生,並且了解一些一般概念,但是似乎無法解決幾個問題。
我有以下ReceiveCallback:
public static void ReceiveCallback(IAsyncResult AR)
{
Socket CurrentSocket = (Socket)AR.AsyncState;
int DataReceived = 0;
try
{
DataReceived = CurrentSocket.EndReceive(AR);
}
catch (SocketException)
{
CurrentSocket.Close();
return;
}
byte[] receivedBuffer = new byte[DataReceived];
Array.Copy(Buffer, receivedBuffer, DataReceived);
strReceived = Encoding.ASCII.GetString(receivedBuffer); // We are saving the latest receivedBuffer in a string.
new MainWindow().Process(); // We are accessing a function in the MainWindow class
receiveDone.Set();
CurrentSocket.BeginReceive(Buffer, 0, BufferSize, SocketFlags.None, ReceiveCallback, CurrentSocket);
}
這是“ Process()”代碼:
public void Process()
{
lblReceived.Text = ClientSocket.strReceived; // Trying to set what we received in a label..
}
在“ new MainWindow()。Process();”行上,我收到以下異常:“其他信息:調用線程必須是STA,因為許多UI組件都需要STA。” 我進行了搜索,並理解了為什么它給了我異常,但是有幾個代碼對我不起作用。
標簽沒有改變,我知道我正在創建一個MainWindow的新實例,這就是為什么什么都沒有顯示的原因,但是我正在尋求例如如何使用新實例來更改標簽的示例。
不幸的是,沒有一個好的, 最小的 , 完整的代碼示例,就無法了解有關您問題的足夠上下文來提供准確的答案。
但是可以得出一些一般性的結論:
因此,僅僅因為您無法訪問該類的某個實例成員(例如此處的Process()
方法)而創建一個類的全新實例總是錯誤的事情。
相反,您需要提供對具有您需要訪問的狀態的現有實例的訪問。
MainWindow
類中聲明了ReceiveCallback()
方法。 如果這個猜測是正確的,那么最明顯的代碼修復方法就是簡單地使ReceiveCallback()
方法成為非static
方法。 即從方法聲明中刪除static
。 這樣做之后,您所需要做的就是直接調用Process()
,而不是首先創建MainWindow
的新實例。 現在,您可能會(或可能不會)發現這樣做需要將方法作為原始I / O操作的參數來提供。 同樣,由於您沒有提供良好的代碼示例,因此無法說出是否或將如何進行。 但是,我提到它只是為了避免您在從聲明中刪除static
變量后,如果它不起作用,您就不會僅僅放棄它。
當然,我的猜測可能是錯誤的。 在這種情況下,一種選擇是提供對MainWindow
實例的引用作為I / O操作的狀態對象。 同樣,如果沒有良好的代碼示例,就無法說出確切的工作方式,但是基本思想是將其作為最后一個參數傳遞給Socket.BeginReceive()
方法(任何重載),然后從IAsyncResult.AsyncState
檢索它IAsyncResult.AsyncState
ReceiveCallback()
方法中的IAsyncResult.AsyncState
屬性。
注意:上面的內容僅用於解決您所遇到的特定異常,因為創建新的MainWindow
實例只是做錯了。 由於I / O操作很可能會在UI線程之外完成,因此您仍然存在與此相關的問題(例如,需要在訪問UI本身的代碼上調用Dispatcher.Invoke()
)。 但是一次只一步。 讓我們先解決當前的問題,然后再繼續解決下一個問題。
如果以上方法均無濟於事,請解決您的問題,使其包含一個良好的代碼示例,並提供實際准確的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.