我想触发StartCoroutine(LogOutUser(url, () => { Debug.Log("logOut req done"); }));
,它通过OnApplicationQuit函数将数据发送到服务器。但是它给出了这个错误*
NullReferenceException:对象引用未设置为对象的实例RegisterLogIn + d__16.MoveNext()(在Assets / Scripts / RegisterLogIn.cs:71)*
RegisterLogIn是下面的代码类别
void LogOut()
{
string url = String.Format("http://localhost:7989/RegisterApi/logout?myTempID={0}", myTempID);
StartCoroutine(LogOutUser(url, () => { Debug.Log("logOut req done"); }));
}
private async void OnApplicationQuit()
{
LogOut();
await websocket.Close();
}
IEnumerator LogOutUser(string url, Action onSuccess)
{
UnityWebRequest req = UnityWebRequest.Get(url);
yield return req.SendWebRequest();
while (!req.isDone)
yield return null;
string result = req.downloadHandler.text;
onSuccess();
}
我该怎么做?
我了解OnApplicationQuit不会等待协程,因为就像另一个线程一样,继续执行它们的工作。您可以包装自己的应用程序退出以处理注销。
public class MyGame : MonoBehaviour
{
public void GameLogic()
{
MyApplication.QuitWithLogOut();
}
}
public class MyApplication : Application
{
public static void QuitWithLogOut()
{
Quiter quiter = new GameObject().AddComponent<Quiter>();
quiter.Quit();
}
}
public class Quiter : MonoBehaviour
{
private bool isLogOutDone;
public void Quit()
{
string url = String.Format("http://localhost:7989/RegisterApi/logout?myTempID={0}", myTempID);
StartCoroutine(LogOutUser(url, () => { Debug.Log("logOut req done"); }));
}
LogOutUser(string url, Action onSuccess)
{
UnityWebRequest req = UnityWebRequest.Get(url);
yield return req.SendWebRequest();
while (!req.isDone)
yield return null;
string result = req.downloadHandler.text;
isLogOutDone = true;
onSuccess();
}
}
如果在OnApplicationQuit中启动协程,则在协程有机会完成之前,应用程序将退出,并且所有对象都将被销毁。
根据此线程,一个简单的Get SendWebRequest被线程化而与主线程无关,因此将主线程阻塞直到完成应该是安全的。
https://forum.unity.com/threads/http-requests-without-coroutines.495418/
您可以尝试阻止主线程返回并等待您的网络请求,但是在这种情况下,我认为您只有几秒钟的时间才能统一终止。
尝试一下:
void LogOut()
{
string url = String.Format("http://localhost:7989/RegisterApi/logout?myTempID={0}", myTempID);
LogOutUser(url, () => { Debug.Log("logOut req done"); });
}
private async void OnApplicationQuit()
{
LogOut();
await websocket.Close();
}
void LogOutUser(string url, Action onSuccess)
{
UnityWebRequest req = UnityWebRequest.Get(url);
req.SendWebRequest();
while (!req.isDone) {
System.Threading.Thread.Sleep(100);
}
string result = req.downloadHandler.text;
onSuccess();
}