Tôi đã có một coroutine trong Unity3D đã tải xuống một zip từ máy chủ, trích xuất nó vào đường dẫn dữ liệu liên tục và tải nội dung của nó vào bộ nhớ. Dòng chảy trông giống như thế này:
IEnumerator LongCoroutine()
{
yield return StartCoroutine(DownloadZip());
ExtractZip();
yield return StartCoroutine(LoadZipContent());
}
Nhưng ExtractZip()
phương thức (sử dụng thư viện DotNetZip), đồng bộ, mất quá nhiều thời gian và khiến tôi không có chỗ để nhường trong quá trình này.
Điều này dẫn đến việc ứng dụng bị giết (trên thiết bị di động) bất cứ khi nào tôi cố trích xuất một zip lớn, mà tôi cho rằng là do luồng chính trở nên không phản hồi quá lâu.
Đây có phải là điều mà hệ điều hành di động được biết là làm (giết ứng dụng nếu một khung hình mất quá nhiều thời gian)?
Vì vậy, tôi giả định rằng trích xuất zip trên một luồng riêng biệt có thể giải quyết vấn đề và dường như nó đã hoạt động. Tôi đã tạo lớp này:
public class ThreadedAction
{
public ThreadedAction(Action action)
{
var thread = new Thread(() => {
if(action != null)
action();
_isDone = true;
});
thread.Start();
}
public IEnumerator WaitForComplete()
{
while (!_isDone)
yield return null;
}
private bool _isDone = false;
}
Và tôi sử dụng nó như thế này:
IEnumerator LongCoroutine()
{
yield return StartCoroutine(DownloadZip());
var extractAction = new ThreadedAction(ExtractZip);
yield return StartCoroutine(extractAction.WaitForComplete());
yield return StartCoroutine(LoadZipContent());
}
Nhưng tôi vẫn không chắc đây là cách tốt nhất để thực hiện nó hay nếu tôi cần khóa _isDone
(không quá quen với đa luồng).
Có thể một cái gì đó sai với điều này / tôi đang thiếu một cái gì đó?