在不阻止gui线程的情况下工作

时间:2015-04-28 00:18:45

标签: c# multithreading asynchronous

我有一个c#windows窗体应用程序并使用一个不提供异步等待功能的库。

当我按下按钮时,我想做一些工作(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. 从线程中返回值
  4. 结束主题

1 个答案:

答案 0 :(得分: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),如果你想要一些阻塞,但你的要求声明你想要非阻塞。

要继续执行或向GUI发出进程已完成的信号,您将在UI线程上调用某些方法,如下所示:

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

这基本上是异步/回调策略。