2016-06-22 5 views
0

私はDataWriter and DataReaderインターフェイスを使用しています。 これらのクラスはIDisposableをインターフェイスが実装されてい、ので、私はusingキーワードの周りにそれらをラップ:。ハンドルusingステートメント内で発生する例外(IDisposable)

using(var datareader = new DataReader(SerialPortInputStream)) 
{ 
CancellationTokenSource cancellation = new CancellationTokenSource(); 
//Timeout 
cancellation.CancelAfter(1000); 
//... 
datareader.LoadAsync(120).AsTask(cancellation.Token); 
//Some fancy methods 
... 
//Last step: Detach the InputStream to use it again 
datareader.DetachStream(); 
} 

このスレッドhere(ここで"TaskCancelledException"を使用して文の内部で発生した例外場合、オブジェクトは今すぐに配置されることを言っています、問題はUWP- DataReaderDataWriterである:彼らは、オブジェクトが配置されます場合、私はdatareader.DetachStreamを(呼び出すためにしたことを防ぐために基本となるストリームを閉じて)してから処分します

我々が使用することはできません。のDataReader/DataWriterは、基本となるInputStream/Outputstreamが後で必要になるときの文です。 この結論は正しいのですか、それともこのような状況を処理する他の方法がありますか?

答えて

1

usingの全体の意味は、自分でコードを書く必要なく、何が起こってもブロックの最後にオブジェクトが配置されるようにすることです。これは、オブジェクトをfinallyブロック内に配置することによって行われます。何をしようとする

は、オブジェクトが配置されます前datareader.DetachStream()を呼び出すことではありません - 再び関係なくを何が起こりますか。

だから私の結論はusing文はここで非常に有用ではないということでしょう、あなたは多分このように、自分でこれを行う必要があります。だから、これはusing文はあなたのコードに何をするか、本質的である

DataReader datareader = null; 
try 
{ 
    datareader = new DataReader(SerialPortInputStream); 
    CancellationTokenSource cancellation = new CancellationTokenSource(); 
    //Timeout 
    cancellation.CancelAfter(1000); 
    //... 
    datareader.LoadAsync(120).AsTask(cancellation.Token); 
    //Some fancy methods 
    ... 
} 
finally 
{ 
    //Last step: Detach the InputStream to use it again 
    datareader?.DetachStream(); 
    datareader?.Dispose(); 
} 

ただし、datareader?.DetachStream()コールを挿入することができます。


datareaderは、最終的にさえusing書なしでとにかく配置され得ることに注意してください。この変数のスコープが残っていると、ガベージコレクションはいつでもメモリからこのインスタンスを削除して、Disposeメソッドを呼び出すことになります。スコープを離れる前にDetachStream()への呼び出しが必要です。

+0

(ご注意:私はそれを難し​​い方法で学びました。特にストリームをもう一度使用する必要があるときは、「突然」ガベージコレクタがストリームを閉じ、他のメソッドを「破棄」します。何が起きても常にDetachStream()を呼び出します。 – FikLi

関連する問題