��权限没有,则隐藏 function forum_list_access_filter($forumlist, $gid, $allow = 'allowread') { global $grouplist; if (empty($forumlist)) return array(); if (1 == $gid) return $forumlist; $forumlist_filter = $forumlist; $group = $grouplist[$gid]; foreach ($forumlist_filter as $fid => $forum) { if (empty($forum['accesson']) && empty($group[$allow]) || !empty($forum['accesson']) && empty($forum['accesslist'][$gid][$allow])) { unset($forumlist_filter[$fid]); } unset($forumlist_filter[$fid]['accesslist']); } return $forumlist_filter; } function forum_filter_moduid($moduids) { $moduids = trim($moduids); if (empty($moduids)) return ''; $arr = explode(',', $moduids); $r = array(); foreach ($arr as $_uid) { $_uid = intval($_uid); $_user = user_read($_uid); if (empty($_user)) continue; if ($_user['gid'] > 4) continue; $r[] = $_uid; } return implode(',', $r); } function forum_safe_info($forum) { //unset($forum['moduids']); return $forum; } function forum_filter($forumlist) { foreach ($forumlist as &$val) { unset($val['brief'], $val['announcement'], $val['seo_title'], $val['seo_keywords'], $val['create_date_fmt'], $val['icon_url'], $val['modlist']); } return $forumlist; } function forum_format_url($forum) { global $conf; if (0 == $forum['category']) { // 列表URL $url = url('list-' . $forum['fid'], '', FALSE); } elseif (1 == $forum['category']) { // 频道 $url = url('category-' . $forum['fid'], '', FALSE); } elseif (2 == $forum['category']) { // 单页 $url = url('read-' . trim($forum['brief']), '', FALSE); } if ($conf['url_rewrite_on'] > 1 && $forum['well_alias']) { if (0 == $forum['category'] || 1 == $forum['category']) { $url = url($forum['well_alias'], '', FALSE); } elseif (2 == $forum['category']) { // 单页 $url = ($forum['threads'] && $forum['brief']) ? url($forum['well_alias'] . '-' . trim($forum['brief']), '', FALSE) : url($forum['well_alias'], '', FALSE); } } return $url; } function well_forum_alias() { $forumlist = forum_list_cache(); if (empty($forumlist)) return ''; $key = 'forum-alias'; static $cache = array(); if (isset($cache[$key])) return $cache[$key]; $cache[$key] = array(); foreach ($forumlist as $val) { if ($val['well_alias']) $cache[$key][$val['fid']] = $val['well_alias']; } return array_flip($cache[$key]); } function well_forum_alias_cache() { global $conf; $key = 'forum-alias-cache'; static $cache = array(); // 用静态变量只能在当前 request 生命周期缓存,跨进程需要再加一层缓存:redis/memcached/xcache/apc if (isset($cache[$key])) return $cache[$key]; if ('mysql' == $conf['cache']['type']) { $arr = well_forum_alias(); } else { $arr = cache_get($key); if (NULL === $arr) { $arr = well_forum_alias(); !empty($arr) AND cache_set($key, $arr); } } $cache[$key] = empty($arr) ? '' : $arr; return $cache[$key]; } ?>c# - How to make a GET request without Monobehaviour or System.IO (using while loop?) - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - How to make a GET request without Monobehaviour or System.IO (using while loop?) - Stack Overflow

programmeradmin9浏览0评论

I am trying to make a GET request but cannot use System.IO, or Monobehaviour (I am working on a Warudo mod).

So far I have the code below. MakeRequest half the time returns the values I want, so I know at least the request is coming through, but half the time it returns an empty string (or whatever I initiate text with). Is there a reason the while loop breaks off early (if that is what it's doing), and/or is there a better way of making this request?

edit: I thought adding && text == "" to the while loop would do the trick, but it still returns an emtpy string half the time

private string MakeRequest()
{
    var text = "";
    var getRequest = CreateRequest(URL).SendWebRequest();
    while (!getRequest.isDone)
    {
        if (getRequest.isDone)
        {
            text = getRequest.webRequest.downloadHandler.text;
        }
    }
    return text;
}
private UnityWebRequest CreateRequest(string path)
{
    var request = new UnityWebRequest(path, "GET");
    request.downloadHandler = new DownloadHandlerBuffer();
    request.SetRequestHeader("Content-Type", "application/json");

    return request;
}

I am trying to make a GET request but cannot use System.IO, or Monobehaviour (I am working on a Warudo mod).

So far I have the code below. MakeRequest half the time returns the values I want, so I know at least the request is coming through, but half the time it returns an empty string (or whatever I initiate text with). Is there a reason the while loop breaks off early (if that is what it's doing), and/or is there a better way of making this request?

edit: I thought adding && text == "" to the while loop would do the trick, but it still returns an emtpy string half the time

private string MakeRequest()
{
    var text = "";
    var getRequest = CreateRequest(URL).SendWebRequest();
    while (!getRequest.isDone)
    {
        if (getRequest.isDone)
        {
            text = getRequest.webRequest.downloadHandler.text;
        }
    }
    return text;
}
private UnityWebRequest CreateRequest(string path)
{
    var request = new UnityWebRequest(path, "GET");
    request.downloadHandler = new DownloadHandlerBuffer();
    request.SetRequestHeader("Content-Type", "application/json");

    return request;
}
Share Improve this question edited Jan 18 at 11:05 Erian asked Jan 18 at 10:33 ErianErian 251 silver badge4 bronze badges 0
Add a comment  | 

1 Answer 1

Reset to default 1

You do

while (!getRequest.isDone)
{
    if (getRequest.isDone)
    {

so you tell me how big is the probability that exactly between the two lines while and if the request finishes so your if check succeeds?

Very very small!

Why not rather move it after the request finishes

Besides that I would also place some check whether the request succeeded at all by checking the result first.

private string MakeRequest()
{
    var getRequest = CreateRequest(URL).SendWebRequest();
    while (!getRequest.isDone)
    {
       // in general not a good idea to do empty loops like this
    }

    if(getRequest.webRequest.result != UnityWebRequest.Result.Success)
    {
        throw new Exception(getRequest.webRequest.error);
    }

    return getRequest.webRequest.downloadHandler.text;
}

This will of course still cause a complete freeze until the request is done and put some heavy load on the CPU running your loop all the time.


Still I wouldn't go for completely freezing implementations but rather go async. There are many ways depending on your exact use case and needs.

Either use a normal Task<string> or UniTask<string> or the new Awaitables. None of these require a MonoBehaviour

发布评论

评论列表(0)

  1. 暂无评论