这里发生了两件事......
当涉及控件(例如您的选项卡控件)时,UI 线程无法与源自不同线程的活动进行交互。为避免跨线程问题,请使用这样的构造...
private void DoSomethingOnTheUiThread()
{
Dispatcher.BeginInvoke((Action) (() =>
{
// your code goes here...
Window w = new Window();
w.Show();
}));
}
...“调度程序”获取与窗口关联的 System.Windows.Threading.Dispatcher 的位置。为此,每个 UIElement 都有一个调度程序。BeginInvoke 安排委托在 UI 线程上运行。
一个相关的 SO 问题在这里提供了更多的见解:WPF Cross Thread Object Access
...以及这里如何处理跨线程访问异常?
对于您的其他问题,让我们看看您的代码...
Task.Factory.StartNew(() =>
{
NewWindow.selectingTab(ClientName);
using (var ns = cl.GetStream())
using (var br = new BinaryReader(ns))
using (var bw = new BinaryWriter(ns))
{
Console.WriteLine("Message from client is " + br.ReadString() + " from " + clientName); } });
在您的评论中,您指出“NewWindow”是一个类。但是您正在调用“NewWindow”的实例方法,而不是“NewWindow”的静态方法。所以编译器抱怨它。
要调用实例方法,必须先创建一个实例,像这样...
NewWindow nw = new NewWindow();
nw.selectedTab("some name");
c# 的前辈将语法“NewWindow.selectedTab”表示为静态方法。我不知道您要实现哪一个,但您需要选择一个与您的使用一致的。
相关文档在这里:http: //msdn.microsoft.com/en-us/library/aa645766 (v=vs.71).aspx
**
当在 EM 形式的成员访问(第 7.5.4 节)中引用方法时,如果 M 是静态方法,E 必须表示包含 M 的类型,如果 M 是实例方法,E 必须表示包含 M 的类型。
**