【发布时间】:2016-05-31 18:13:42
【问题描述】:
我正在使用 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;
}
【问题讨论】: