C #에서 폐기 된 폐쇄에 대한 액세스?
Microsoft 엔터프라이즈 라이브러리 (데이터 응용 프로그램 블록)를 조사하고 있습니다. 샘플 sln.
그들은 비동기 적으로 데이터를 읽는 샘플을 가지고 있습니다 ( IAsync
새로운 버전 (6)도 지원하지만 async
).
하지만 Resharper ( 또는 Visual Studio- nevermind )는 다음과 같이 표시합니다. "처분 된 폐쇄에 대한 액세스": (먼저 이미지를 표시 할 것이므로 더 명확해질 것입니다. 그런 다음 코드를 붙여 넣습니다)
코드 :
/*1*/ [Description("Execute a command that retrieves data asynchronously")]
/*2*/ static void ReadDataAsynchronously()
/*3*/ {
/*4*/ if (!SupportsAsync(asyncDB)) return;
/*5*/
/*6*/ using(var doneWaitingEvent = new ManualResetEvent(false))
/*7*/ using(var readCompleteEvent = new ManualResetEvent(false))
/*8*/ {
/*9*/ try
/*10*/ {
/*11*/ // Create command to execute stored procedure and add parameters
/*12*/ DbCommand cmd = asyncDB.GetStoredProcCommand("ListOrdersSlowly");
/*13*/ asyncDB.AddInParameter(cmd, "state", DbType.String, "Colorado");
/*14*/ asyncDB.AddInParameter(cmd, "status", DbType.String, "DRAFT");
/*15*/ // Execute the query asynchronously specifying the command and the
/*16*/ // expression to execute when the data access process completes.
/*17*/ asyncDB.BeginExecuteReader(cmd,
/*18*/ asyncResult = >
/*19*/ {
/*20*/ // Lambda expression executed when the data access completes.
/*21*/ doneWaitingEvent.Set();
/*22*/ try
/*23*/ {
/*24*/ using(IDataReader reader = asyncDB.EndExecuteReader(asyncResult))
/*25*/ {
/*26*/ Console.WriteLine();
/*27*/ Console.WriteLine();
/*28*/ DisplayRowValues(reader);
/*29*/ }
/*30*/ }
/*31*/ catch (Exception ex)
/*32*/ {
/*33*/ Console.WriteLine("Error after data access completed: {0}", ex.Message);
/*34*/ }
/*35*/ finally
/*36*/ {
/*37*/ readCompleteEvent.Set();
/*38*/ }
/*39*/ }, null);
/*40*/
/*41*/ // Display waiting messages to indicate executing asynchronouly
/*42*/ while (!doneWaitingEvent.WaitOne(1000))
/*43*/ {
/*44*/ Console.Write("Waiting... ");
/*45*/ }
/*46*/
/*47*/ // Allow async thread to write results before displaying "continue" prompt
/*48*/ readCompleteEvent.WaitOne();
/*49*/ }
/*50*/ catch (Exception ex)
/*51*/ {
/*52*/ Console.WriteLine("Error while starting data access: {0}", ex.Message);
/*53*/ }
/*54*/ }
/*55*/ }
질문 :
이 경고를하는 이유는 무엇입니까? 없다 manualreset-checked-signal
(루프에서 실행되는)되는 것을 방지using
하는 방법을 - - 절에 도달 할 수 없음을 dispose
호출합니다.
그렇다면 왜 소리를 지르나요 (경고)?
You pass doneWaitingEvent
to a lambda that may extend beyond the scope of the using block. I.e. there's a risk that Dispose
will have been called when the lambda executes.
It yells warning because the engine is not smart enough to figure out that the using block will never be exited before the delegate code completes. That is why this is a warning not a error.
You can safely ignore this warning, you can have resharper suppress the warning by wrapping the lines with special comments
asyncDB.BeginExecuteReader(cmd, asyncResult =>
{
// Lambda expression executed when the data access completes.
// ReSharper disable AccessToDisposedClosure
doneWaitingEvent.Set();
// ReSharper restore AccessToDisposedClosure
try
{
using (IDataReader reader = asyncDB.EndExecuteReader(asyncResult))
{
Console.WriteLine();
Console.WriteLine();
DisplayRowValues(reader);
}
}
catch (Exception ex)
{
Console.WriteLine("Error after data access completed: {0}", ex.Message);
}
finally
{
// ReSharper disable AccessToDisposedClosure
readCompleteEvent.Set();
// ReSharper restore AccessToDisposedClosure
}
}, null);
The reason you see ReSharper's warnings is that ReSharper's code flow analysis engine is not strong enough to see what is going on: they assume that your code could get to the end of the using
clause without doneWaitingEvent
being set, which is not possible due to a while
loop:
while (!doneWaitingEvent.WaitOne(1000)) {
Console.Write("Waiting... ");
}
루프는 호출 "Waiting... "
될 때까지 라인 을 계속 인쇄 doneWaitingEvent.Set();
하여 코드가 using
블록 끝에 도달하지 못하도록합니다 . 다른 경고도 마찬가지입니다.
간단히 말해서이 경고는 무시해도됩니다. ReSharper의 "이 경고 무시"주석을 추가하고 선택적으로 버그 보고서를 제출합니다.
참고 URL : https://stackoverflow.com/questions/17620430/access-to-disposed-closure-in-c
'Programing' 카테고리의 다른 글
UICollectionView 레이아웃 문제 (0) | 2020.12.04 |
---|---|
div를 숨기고 빈 공간은 유지 (0) | 2020.12.04 |
data.frame Group By 열 (0) | 2020.12.04 |
/ usr / local / bin이 Mac의 $ PATH에 있는지 확인 (0) | 2020.12.04 |
규칙을 사용하여 자동으로 구체화 된 뷰를 새로 고치거나 알림 (0) | 2020.12.04 |