2016-02-19 2 views
0

Я работаю с TaskCompletionSource. Я регистрирую событие на объекте, но когда я пытаюсь отменить регистрацию в методе событий, resharper подчеркивает это примечанием: доступ к модифицированному закрытию.Доступ к измененному закрытию в делегате

вот мой код

var taskCompletionSource = new TaskCompletionSource<bool>(); 
OnConnectionStateChangedInd handlerConnectionStateChangedInd = null; 
OnBootCompletedCnfCallback handlerBootCompletedCnfCallback = null; 

handlerConnectionStateChangedInd = (id, method, addr, port, nick) => 
{ 
    _corePttObject.onConnectionStateChangedInd -= handlerConnectionStateChangedInd; 
    _connectionState = id; 

    taskCompletionSource.SetResult(true); 
}; 
_corePttObject.onConnectionStateChangedInd += handlerConnectionStateChangedInd; 

Эта линия подчеркнуты:

_corePttObject.onConnectionStateChangedInd - = handlerConnectionStateChangedInd;

Вот мое полное определение метода:

public Task<LoginResult> LoginAsync(string address) 
    { 
     var taskCompletionSource = new TaskCompletionSource<LoginResult>(); 
     OnUserAcceptCertWithNamePasswInd handlerAcceptCertWithNamePasswInd = null; 
     OnAppExLoginProtocolServiceCnf handlerAppExLoginProtocolServiceCnf = null; 
     handlerAcceptCertWithNamePasswInd = (cert, caCert, rootCert, hash, pos, data) => 
     { 
      var loginCompletedArgs = new LoginResult 
      { 
       SvrCertificate = ParseCertificate(cert), 
       CaCertificate = ParseCertificate(caCert), 
       RootCertificate = ParseCertificate(rootCert), 
       CertificateHash = hash, 
       GridPosition = pos, 
       GridData = data 
      }; 
      _corePttObject.onUserAcceptCertWithNamePasswInd -= handlerAcceptCertWithNamePasswInd; 
      taskCompletionSource.SetResult(loginCompletedArgs); 
     }; 

     handlerAppExLoginProtocolServiceCnf = (nick, result, cause, link) => 
     { 
      _corePttObject.onAppExLoginProtocolServiceCnf -= handlerAppExLoginProtocolServiceCnf; 
     }; 

     _corePttObject.onAppExLoginProtocolServiceCnf += handlerAppExLoginProtocolServiceCnf; 
     _corePttObject.onUserAcceptCertWithNamePasswInd += handlerAcceptCertWithNamePasswInd; 
     //TODO: read id. 
     _corePttObject.Login(address, true, "ID"); 

     return taskCompletionSource.Task; 
    } 

ответ

1

Причиной этого предупреждения является: для handlerConnectionStateChangedInd вы объявляете анонимный метод, который - при его исполнении - будет получать/изменять _corePttObject.onConnectionStateChangedInd.

Затем после этой декларации, вы изменить_corePttObject.onConnectionStateChangedInd уже в этой строке:

_corePttObject.onConnectionStateChangedInd += handlerConnectionStateChangedInd; 

Так ReSharper предупреждает вас о том, что значение _corePttObject.onConnectionStateChangedInd отличается от времени вы объявляете handlerConnectionStateChangedInd и время, выполняется.

+0

Так что я должен беспокоиться о каких-либо проблемах? – JuP

+0

@JurajP Пока вы знаете, что делаете, не нужно беспокоиться. И ваш код выглядит нормально. –

1

Если нажать кнопку на лампочку предложении, будет вариант «Почему ReSharper предлагает это». Если вы нажмете на него, это приведет вас к этому полезному explanation.

Мне нужно больше контекста, чтобы определить, может ли эта потенциальная ловушка повредить вам в вашем конкретном случае.

Вы также можете проверить this answer here.

Смежные вопросы