【发布时间】:2012-08-26 19:37:58
【问题描述】:
我需要使用所有标准 RESTful 方法发送 HTTP 请求并访问请求的主体,以便使用它发送/接收 JSON。我已经调查过了,
WebRequest.HttpWebRequest
这几乎可以完美地工作,但是在某些情况下,例如,如果服务器关闭,则 GetResponse 函数可能需要几秒钟才能返回 - 因为它是同步方法 - 在此期间冻结应用程序。此方法的异步版本 BeginGetResponse 似乎不能异步工作(无论如何在 Unity 中),因为它仍然会在这段时间内冻结应用程序。
UnityEngine.WWW#
出于某种原因仅支持 POST 和 GET 请求 - 但我还需要 PUT 和 DELETE(标准 RESTful 方法),所以我没有再费心去研究它。
System.Threading
为了在不冻结应用程序的情况下运行 WebRequest.HttpWebRequest.GetResponse,我研究过使用线程。线程似乎在编辑器中工作(但似乎非常不稳定 - 如果您在应用程序退出时不停止线程,即使您停止它,它也会永远在编辑器中运行),并且当构建到 iOS 设备时,它会尽快崩溃当我尝试启动一个线程时(我忘记写下错误,我现在无权访问它)。
在原生 iOS 应用中运行线程并连接到 Unity 应用
可笑,甚至不会尝试。
UniWeb
这个。我想知道他们是如何做到的。
这是我正在尝试的 WebRequest.BeginGetResponse 方法的示例,
// The RequestState class passes data across async calls.
public class RequestState
{
const int BufferSize = 1024;
public StringBuilder RequestData;
public byte[] BufferRead;
public WebRequest Request;
public Stream ResponseStream;
// Create Decoder for appropriate enconding type.
public Decoder StreamDecode = Encoding.UTF8.GetDecoder();
public RequestState()
{
BufferRead = new byte[BufferSize];
RequestData = new StringBuilder(String.Empty);
Request = null;
ResponseStream = null;
}
}
public class WebRequester
{
private void ExecuteRequest()
{
RequestState requestState = new RequestState();
WebRequest request = WebRequest.Create("mysite");
request.BeginGetResponse(new AsyncCallback(Callback), requestState);
}
private void Callback(IAsyncResult ar)
{
// Get the RequestState object from the async result.
RequestState rs = (RequestState) ar.AsyncState;
// Get the WebRequest from RequestState.
WebRequest req = rs.Request;
// Call EndGetResponse, which produces the WebResponse object
// that came from the request issued above.
WebResponse resp = req.EndGetResponse(ar);
}
}
...基于此:http://msdn.microsoft.com/en-us/library/86wf6409(v=vs.71).aspx
【问题讨论】:
-
请举例说明您如何使用 BeginGetResponse... 您的代码也可能有问题(一般评论,不确定 Unity 是否对此调用有特殊行为)。
-
添加了示例。我相信 Unity 使用了 Mono 2.6 的定制版本。
-
嘿,先生,您的问题显然很混乱,只能由您自己回答,但我在统一和 http 请求方面面临完全相同的问题。而不是线程,我正在尝试
coroutines。我不认为线程是最好的路径,但我仍然无法用协程弄清楚。您对此有任何更新吗?你试过我的路吗?你能分享你的解决方案吗? -
当在协程中使用时,有问题的方法仍然会冻结应用程序,直到它返回 - 我的理论是该方法冻结了调用它的线程。我认为协程不涉及线程,因此在它们中调用的任何内容都会在主线程上执行,就像在其他任何地方调用它一样冻结应用程序。在线程中调用该方法效果很好,只是要非常小心地手动关闭线程,因为 unity/mono 似乎不会自动完成。
-
你回答得很快@Ford,但由于某种原因我没有收到通知。我在
WWW和LoadLevelAsync的并行进程中使用协程取得了很大的成功,所以我认为这里也有可能。但现在我相信,正如你所说,它实际上并没有创建自己的线程,所以它实际上只是在同一个线程中进行异步调用......无论如何,如果你弄清楚了,你能与我们分享你的解决方案吗?还是超过 3 页宽,例如您的 msdn 链接?
标签: c# ios multithreading http unity3d