循環引用雖然在C#中允許,但往往是糟糕的體系結構決策的症狀。這可能嗎?
void MyEventFunction(object sender, EventArgs e)
{
string txt = MyClassFromB.GetStringFromB();
textBox1.Text = txt;
}
理想情況下,你會希望B的代碼,只是給你想要的,當你需要它的字符串,所以當它被更新一個可以控制的。
或者,您可以得到涉及的代表。
在B:
public class MyClass
{
public delegate void UpdateStringVar(string x);
private UpdateStringVar usv;
MyClass(UpdateStringVar v)
{
usv = v;
}
void ContinuouslyRunningOperation()
{
string status = //get some string
usv(status);
}
}
在答:
如果你的整個應用程序是單線程
void UpdateTextBox(string x)
{
textBox1.Text = x;
}
MyClass myClass = new MyClass(UpdateTextBox);
像這樣的工作,但WinForms控件有惱人的「只能訪問該對象創建它的線程「的要求,所以如果你的B代碼運行在不同的線程上,那麼額外的工作將是必需的。
不知道爲什麼你需要一個循環引用(你不能)...通常項目A是UI和項目B是一個類庫。您應該能夠從項目A調用項目B中的邏輯來呈現數據。其他方法是API,共享數據庫等。您的具體用例是什麼? –
考慮用你想要在其中重用的winform創建一個新的「通用」項目。這樣項目A和B可以參考這個常見的項目。另一種解決方案可能是使用[鏈接](https://docs.microsoft.com/en-us/dotnet/framework/mef/) – 4D1C70
@LukeHutton項目A是UI。項目A調用項目B中的構造函數,啓動一些數據處理 - 我想使用項目A中的UI文本框向用戶顯示處理信息。我正在處理一個安裝程序 - 項目B的處理信息將會是顯示以讓用戶知道當前正在做什麼。 – Roka545