如何让异步方法返回值?

问题描述 投票:0回答:7

我知道如何创建异步方法,但说我有一个方法可以完成很多工作然后返回一个布尔值?

如何在回调中返回布尔值?

澄清

public bool Foo(){
    Thread.Sleep(100000); // Do work
    return true;
}

我希望能够使其异步。

c# asynchronous
7个回答
165
投票

C# 5.0开始,您可以将方法指定为

public async Task<bool> doAsyncOperation()
{
    // do work
    return true;
}

bool result = await doAsyncOperation();

61
投票

有几种方法可以做到这一点...最简单的是让异步方法也执行后续操作。另一种流行的方法是传递回调,即

void RunFooAsync(..., Action<bool> callback) {
     // do some stuff
     bool result = ...

     if(callback != null) callback(result);
}

另一种方法是在异步操作完成时引发事件(结果在事件参数数据中)。

此外,如果您使用的是 TPL,则可以使用

ContinueWith
:

Task<bool> outerTask = ...;
outerTask.ContinueWith(task =>
{
    bool result = task.Result;
    // do something with that
});

4
投票

使用后台工作者。它将允许您在完成时获得回调并允许您跟踪进度。您可以将事件参数的结果值设置为结果值。

    public void UseBackgroundWorker()
    {
        var worker = new BackgroundWorker();
        worker.DoWork += DoWork;
        worker.RunWorkerCompleted += WorkDone;
        worker.RunWorkerAsync("input");
    }

    public void DoWork(object sender, DoWorkEventArgs e)
    {
        e.Result = e.Argument.Equals("input");
        Thread.Sleep(1000);
    }

    public void WorkDone(object sender, RunWorkerCompletedEventArgs e)
    {
        var result = (bool) e.Result;
    }

4
投票

可能最简单的方法是创建一个委托,然后

BeginInvoke
,然后在将来的某个时间等待,然后
EndInvoke

public bool Foo(){
    Thread.Sleep(100000); // Do work
    return true;
}

public SomeMethod()
{
    var fooCaller = new Func<bool>(Foo);
    // Call the method asynchronously
    var asyncResult = fooCaller.BeginInvoke(null, null);

    // Potentially do other work while the asynchronous method is executing.

    // Finally, wait for result
    asyncResult.AsyncWaitHandle.WaitOne();
    bool fooResult = fooCaller.EndInvoke(asyncResult);

    Console.WriteLine("Foo returned {0}", fooResult);
}

1
投票

也许您可以尝试 BeginInvoke 指向您的方法的委托,如下所示:



    delegate string SynchOperation(string value);

    class Program
    {
        static void Main(string[] args)
        {
            BeginTheSynchronousOperation(CallbackOperation, "my value");
            Console.ReadLine();
        }

        static void BeginTheSynchronousOperation(AsyncCallback callback, string value)
        {
            SynchOperation op = new SynchOperation(SynchronousOperation);
            op.BeginInvoke(value, callback, op);
        }

        static string SynchronousOperation(string value)
        {
            Thread.Sleep(10000);
            return value;
        }

        static void CallbackOperation(IAsyncResult result)
        {
            // get your delegate
            var ar = result.AsyncState as SynchOperation;
            // end invoke and get value
            var returned = ar.EndInvoke(result);

            Console.WriteLine(returned);
        }
    }

然后使用您作为 AsyncCallback 发送的方法中的值继续..


0
投票

这应该有效:

public async Task<bool> Foo()
{
    Thread.Sleep(100000); // Do work
    return await Task.FromResult(true);
}

-3
投票

您应该使用异步方法的 EndXXX 来返回值。 EndXXX 应该等待,直到使用 IAsyncResult 的 WaitHandle 得到结果,然后返回该值。

© www.soinside.com 2019 - 2024. All rights reserved.