【问题标题】:How to run the anonymous function如何运行匿名函数
【发布时间】:2015-01-16 14:21:30
【问题描述】:

这两个函数有效,但我的问题是匿名函数(接收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);
}

【问题讨论】:

  • 你确定你的第一个括号是正确的吗,它说await _da.CheckServiceConnection((ServiceCheck)
  • 是的,ServiceCheck是CheckServiceConnection完成后返回给匿名函数的字符串。

标签: c# asynchronous anonymous async-await


【解决方案1】:

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

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

OnComplited( "some string" );

【讨论】:

  • 这很明显,但我的问题是如何用 tcs.TrySetResult(....) 包装 OnComplited("some string") ?
【解决方案2】:

您永远不会调用参数。它不会被自动调用。

但是,无论如何,我认为没有太多理由这样做。您正在等待方法,那么为什么不这样做呢?

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

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

另外,你确定CheckServiceConnection 方法不应该返回Task 吗?这很少是一个好主意。

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

【讨论】:

  • @user1731254 为了优雅而优雅通常是个坏主意。尝试以“简单”为目标:)
猜你喜欢
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 2019-08-19
相关资源
最近更新 更多