2015-04-28 56 views
0

我有一個C#窗體窗體應用程序,並使用一個不提供異步等待功能的庫。在不阻塞GUI線程的情況下工作

當我按下按鈕時,我想做一些工作(webrequesting)。 在做這項工作時,我不想凍結我的gui。

我試過多種方法,例如:

public static Task<bool> LoginUser(string username, string password) 
{ 
    return Task.Factory.StartNew(() => 
    { 
     try 
     { 
      session = new AuthenticatedSession<User>(new User(username), Cryptography.GetMd5(password)); 

      return true; 
     } 
     catch (InvalidAuthenticationException) 
     { 
      return false; 
     } 
    }); 
} 

當我打電話LoginUser("foo", "bar").Result的GUI凍結,直至工作完成(我明白,這是不是異步,因爲我不能等待new AuthenticatedSession<..

所以我期待這樣的事情:

  1. 用行動爲參數創建一個線程
  2. 返回從螺紋
  3. 值結束線程
+2

庫提供的方法是否使用[Asynchronous Programming Model](https://msdn.microsoft.com/en-us/library/ms228963%28v=vs.110%29.aspx)(又名'BeginInvoke'和'EndInvoke')?你在.Net 4.5或更高版本?你有沒有看過[continuations](https://msdn.microsoft.com/en-us/library/dd270696%28v=vs.110%29.aspx)?我們*真的需要了解更多關於您的開發環境以幫助解決這個問題。 – Cameron

回答

2

嘗試迫使一個新的線程(或的WorkerThread),而不是使用TaskFactory。

Thread t = new Thread (delegate() 
{ 
    try 
    { 
     session = new AuthenticatedSession<User>(new User(username), Cryptography.GetMd5(password)); 
     Success(); //coded below 
    } 
    catch (InvalidAuthenticationException) 
    { 
     Fail(); 
    }  
}); 
t.Start(); 

您的清單,要求我們返回一個值,我們真正能做的就是打電話指示返回值,甚至信號(ManualResetEventSlim),如果你想要一些阻塞的方法或設置狀態,但是你的要求說明您想要無阻塞。

恢復執行或信號,你的程序完成後,你將調用一些方法在UI線程上,這樣的GUI:

void Success() { 
    Invoke((MethodInvoker) delegate { 
    SomeMethodOnTheUI(); 
    }); 
} 

這基本上是一個異步/回調的策略。

+0

請注意,OP的問題與啓動線程無關,而是以等待結果的錯誤方式(UI線程上的'.Result')。所以除非你解釋神奇的'Success()'函數(包括'Invoke'),我不認爲這會對OP有幫助。 –

+2

我希望我的最新編輯能夠解決這個問題。 –

相關問題