C#: yield return in lock-Kontext?
Ist es zulässig, in einem lock-Kontext yield return ... zu machen?
Der Compiler wirft keinen Fehler, jedoch bekomme ich eine Exception zur Laufzeit an der Stelle, wo der lock-Kontext verlassen wird.
Da ich in der aufrufenden Funktion einen asynchronen Call mache, kann es doch sein, dass sich der Threadkontext ändert und somit der lock() in einem anderen Thread geschlossen wird, als er geöffnet wurde - was ja nicht vorgesehen ist, da lock sich auf einen Threadkontext bezieht.
public IEnumerable<SomeClass> GetAffectedItems(string par)
{
lock (_lockObject)
{
foreach (var e in _myList)
{
if (e.x == par)
{
yield return e;
}
}
} // <- Problem hier!!!
}
Aufruf mit:
public async Task foo()
{
...
...
IEnumerable<SomeClass> items = GetAffectedItems("abc");
foreach (var i in items)
{
...
...
await some_async_function();
...
...
}
}
Jedenfalls bekomme ich eine Exception:
Object synchronization method was called from an unsynchronized block of code.
Kann meine obige Überlegung der Grund für die Exception sein? Dann wäre es ja hochgefährlich, yield return in einem lock-Kontext durchzuführen, oder?