Tôi hiểu rằng các điều tra viên và từ khóa lợi nhuận có thể được sử dụng để trợ giúp các hoạt động không đồng bộ/so le, vì bạn có thể gọi MoveNext()
để chạy khối mã tiếp theo.GC hoạt động như thế nào với IEnumerator và năng suất?
Tuy nhiên, tôi không thực sự hiểu đối tượng Đếm đó là gì. Bộ nhớ trong việc sử dụng phạm vi của Điều tra viên đi đâu? Nếu bạn không MoveNext()
một điều tra viên tất cả các cách, nó có được GC cuối cùng? Về cơ bản, tôi đang cố gắng giảm số lần truy cập GC, vì tôi có khả năng sử dụng rất nhiều bảng liệt kê và GC có thể là một vấn đề bên trong Unity, đặc biệt là do phiên bản cũ hơn của Mono nó sử dụng.
Tôi đã cố gắng để hồ sơ này nhưng không thể quấn đầu của tôi xung quanh họ vẫn còn. Tôi không hiểu phạm vi/tham chiếu xảy ra với các Điều tra viên. Tôi cũng không hiểu nếu Enumerators được tạo ra như là đối tượng khi bạn tạo một từ một chức năng sản lượng.
Ví dụ sau đây cho thấy sự nhầm lẫn của tôi tốt hơn:
// Example enumerator
IEnumerator<bool> ExampleFunction()
{
SomeClass heavyObject = new SomeClass();
while(heavyObject.Process())
{
yield return true;
}
if(!heavyObject.Success)
{
yield return false;
}
// In this example, we'll never get here - what happens to the incomplete Enumerator
// When does heavyObject get GC'd?
heavyObject.DoSomeMoreStuff();
}
// example call - Where does this enumerator come from?
// Is something creating it with the new keyword in the background?
IEnumerator<bool> enumerator = ExampleFunction();
while(enumerator.MoveNext())
{
if(!enumerator.Current)
{
break;
}
}
// if enumerator is never used after this, does it get destroyed when the scope ends, or is it GC'd at a later date?
Trình biên dịch viết lại phương pháp liệt kê của bạn và di chuyển mã vào một lớp với tên không thể nói. Lớp này thực hiện một máy trạng thái nơi các biến cục bộ của bạn trở thành các trường của lớp, cho phép MoveNext() được nhập lại mà không làm mất trạng thái. Tham chiếu giao diện IEnumerator thực sự là một tham chiếu đến một đối tượng của lớp đó. Mọi thứ sẽ không tồn tại khi tham chiếu đó được thu thập, đủ điều kiện để được GC-ed ngay sau khi mã của bạn rời khỏi vòng lặp foreach. –
Ví dụ về những gì Hans đã nói: http://goo.gl/fs4eNo – xanatos
OK, cảm ơn. Điều đó không làm những gì tôi mong đợi ở TẤT CẢ. Điều đó có nghĩa là ĐTV có khá nặng so với các phương tiện truyền thống không? Tôi đang cố gắng để giữ GC xuống nhưng có vẻ như tôi sẽ tạo ra rác mới bất cứ lúc nào tôi bắt đầu một Enumerator mới (và tôi có rất nhiều điều tra viên). – mGuv