如何运行匿名函数

时间:2015-01-16 14:21:31

标签: c# asynchronous anonymous async-await

这两个函数有效但我的问题是永远不会调用匿名函数(接收ServiceCheck作为参数的函数)。
我需要做些什么才能使CheckServiceConnection函数返回字符串,以便匿名函数运行?

internal async void CheckServiceConnection()
{
    await _da.CheckServiceConnection((ServiceCheck) =>
    {
        GeneralEventArgs args = new GeneralEventArgs();
        args.GeneralObject = (object)ServiceCheck;
        ServiceConnection(this, args);
    });
}

public Task<string> CheckServiceConnection(Action<string> OnComplited)
{
    var tcs = new TaskCompletionSource<string>();

    ws.CheckServiceCompleted += (s, e) =>
    {
        if (e.Error != null)
            tcs.TrySetException(e.Error);
        else if (e.Cancelled)
            tcs.TrySetCanceled();
        else if (e.Result != null)
            tcs.TrySetResult(e.Result);
    };
    try
    {
        ws.CheckServiceAsync();
    }
    catch (Exception ex)
    {
        ws.LogAsync(ex.Message, "DataManager.CheckServiceConnection()");
    }
    return tcs.Task;
}

当我写这样的CheckServiceConnection函数时 - 它正在工作 (当然CheckServiceConnection没有收到任何参数):

internal async void CheckServiceConnection()
{
    var ServiceCheck = await _da.CheckServiceConnection();
    GeneralEventArgs args = new GeneralEventArgs();
    args.GeneralObject = (object)ServiceCheck;
    ServiceConnection(this, args);
}

2 个答案:

答案 0 :(得分:2)

您的CheckServiceConnection方法永远不会调用传递给它的OnComplited操作参数。这就是为什么第一个函数中的匿名函数永远不会被调用的原因。

如果要将匿名函数传递给CheckServiceConnection并调用它,则需要调用它。也就是说,你添加一行如下:

OnComplited( "some string" );

答案 1 :(得分:0)

你永远不会打电话。它不会被自动调用。

然而,无论如何,我认为没有太多理由这样做。你在等待这个方法,为什么不这样做呢?

internal async void CheckServiceConnection()
{
  var result = await _da.CheckServiceConnection();

  GeneralEventArgs args = new GeneralEventArgs();
  args.GeneralObject = result;
  ServiceConnection(this, args);
}

此外,您确定CheckServiceConnection方法不应该返回Task吗?这不是一个好主意。

总而言之,您似乎在混合使用了很多不同的通知方法,异步代码等等。也许您想稍微修改一下设计?