2015-05-15 87 views
-2

我正在尋找一種方法來從後臺線程關閉窗體。 場景: 它在後臺線程聊天應用程序來管理TCP客戶端 現在我想從這個線程C#關閉從後臺線程的WPF窗體線程

App.xaml.cs

public List<Window> dialogs = new List<Window>(); 

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    Login loginDialog = new Login(); 
    GUI.MainWindow mainDialog = new GUI.MainWindow(); 

    dialogs.Add(loginDialog); 
    dialogs.Add(mainDialog); 

    client = new Klassen.TClient(dialogs); 

    if (loginDialog.ShowDialog() != true) 
     return; 
} 

的TClient類關閉第一種形式

public class TClient 
{ 
    public TSocket socket; 

    public TClient(List<Window> dialogs) 
    { 
     socket = new TSocket(dialogs); 
    } 
} 

的TSocket類,與後臺線程

public class TSocket 
{ 
    /* Variables */ 
    List<Window> dialogs; 

    public TSocket(List<Window> dialogs) 
    { 
     this.dialogs = dialogs; 
     clientThread = new Thread(connectionWorker); 
     clientThread.Start(); 
    } 

    public bool connect() 
    { 
     /* Connect */ 
    } 

    void connectionWorker() 
    { 
     connect(); 
     while (isConnected) 
     { 
      /* if statment */ 
      Login loginDialog = (Login)dialogs[0]; 
      //dialogs[1].Close(); 
     } 
    } 
} 

我已經嘗試過了delagate工作和調用,但它並沒有正常工作

+5

你有沒有考慮過你的抽象類TSocket讓我不UI直接工作?就像直接調用Window類一樣,它暴露了你在UI中處理的事件(如連接/斷開連接)? – kape123

+0

事件的樣子應該如何? – JFL

回答

1

Windows程序只允許與UI操作主界面THEAD工作。

static class UiUtils 
    { 
    static UiUtils() 
    { 
     Dispatcher = Application.Current == null 
      ? null 
      : Application.Current.Dispatcher; 
    } 

    public static Dispatcher Dispatcher { get; private set; } 

    public static void InvokeMainThread(this Action action) 
    { 
     try 
     { 
      if (Dispatcher != null && !Dispatcher.CheckAccess()) 
       Dispatcher.Invoke(action); 
      else 
       action(); 
     } 
     catch(Exception ex) 
     { 
      Debug.WriteLine("Error invoking main thread: {0}", ex); 
     } 
    } 
} 

並在代碼中,你應該從任何線程調用:

UiUtils.InvokeMainThread(()=>{loginDialog.Close();});`