2015-01-16 5 views
0

Эти две функции работают, но моя проблема заключается в том, что анонимная функция (та, которая принимает 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); 
} 
+0

Вы уверены, что круглые скобки правильны в вашем первом, где говорится: 'await _da.CheckServiceConnection ((ServiceCheck)'? – Slime

+0

Да, ServiceCheck - это строка, возвращающая анонимную функцию при выполнении CheckServiceConnection. – user1731254

ответ

2

Вашего метод CheckServiceConnection никогда не называет аргумента OnComplited действий, переданный ему , Вот почему ваша анонимная функция в первой функции никогда не вызывается.

Если вы хотите передать анонимную функцию CheckServiceConnection и позвоните, вам необходимо позвонить. То есть вы добавили строку, подобную этой:

OnComplited("some string"); 
+0

Это очевидно, но моя проблема заключается в том, как я могу обернуть OnComplited («некоторая строка») с помощью tcs.TrySetResult (....)? – user1731254

0

Вы никогда не вызываете аргумент. Это не будет вызвано автоматически.

Однако в любом случае я не вижу большой причины для этого. Вы ждете метода, так почему бы просто не сделать это?

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

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

Кроме того, вы уверены, что метод CheckServiceConnection не должен возвращать Task? Это редко бывает хорошей идеей.

В целом, похоже, вы смешиваете множество различных подходов к уведомлениям, асинхронному коду и т. Д. Может быть, вы хотите немного пересмотреть свой дизайн?

+0

Спасибо - моя мысль состояла в том, чтобы сделать это более элегантным .... – user1731254

+0

@ user1731254 Elegant ради элегантности, как правило, плохая идея. Попробуйте вместо этого «просто»: – Luaan