簡體   English   中英

如何在異步方法中使用其他類中的其他函數

[英]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..
    }
  1. 在“ new MainWindow()。Process();”行上,我收到以下異常:“其他信息:調用線程必須是STA,因為許多UI組件都需要STA。” 我進行了搜索,並理解了為什么它給了我異常,但是有幾個代碼對我不起作用。

  2. 標簽沒有改變,我知道我正在創建一個MainWindow的新實例,這就是為什么什么都沒有顯示的原因,但是我正在尋求例如如何使用新實例來更改標簽的示例。

不幸的是,沒有一個好的, 最小的完整的代碼示例,就無法了解有關您問題的足夠上下文來提供准確的答案。

但是可以得出一些一般性的結論:

  1. 最重要的是,如果您需要訪問一個類的實例成員,那是因為(或者至少應該是因為……如果該類的設計合理,它將一直存在)您已經需要該類的一個實例采用。 即該實例具有您需要訪問的狀態。

因此,僅僅因為您無法訪問該類的某個實例成員(例如此處的Process()方法)而創建一個類的全新實例總是錯誤的事情。

相反,您需要提供對具有您需要訪問的狀態的現有實例的訪問。

  1. 我只是根據所提供的代碼的一點點猜測,我想實際上在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM