2014-05-19 73 views
0

我有一個方法,將不會返回到瀏覽器的響應,我試過使用瀏覽器本身和鉻擴展POSTMan。任務<T>在WebApi沒有響應,但返回非任務工程

[AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public Task<List<UserNotifications>> GetNotifications() 
    { 
     Task<List<UserNotifications>> userNotList = new Task<List<UserNotifications>>(() => new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }); 
     return userNotList; 
    } 

但是,如果我改變方法不返回類型任務...

[AllowAnonymous] 
[Route("getNotifications")] 
[Authorize] 
[AcceptVerbs("Get", "Post")] 
public List<UserNotifications> GetNotifications() 
{ 
    var newstring = ""; 
    List<UserNotifications> userNotList = new List<UserNotifications>{ 
     new UserNotifications() 
     { 
      UserId = new Guid(), 
      MessageText = "Message 1", 
      MessageTime = DateTime.Now, 
      Status = true, 
      Subject = "new message 1" 
     }, 
     new UserNotifications() 
     { 
      UserId = new Guid(), 
      MessageText = "Message 2", 
      MessageTime = DateTime.Now, 
      Status = true, 
      Subject = "new message 2" 
     }, 
     new UserNotifications() 
     { 
      UserId = new Guid(), 
      MessageText = "Message 3", 
      MessageTime = DateTime.Now, 
      Status = true, 
      Subject = "new message 3" 
     } 
    }; 

    return userNotList; 
} 

我得到的每一次

[ 
    { 
     "userId": "00000000-0000-0000-0000-000000000000", 
     "subject": "new message 1", 
     "messageText": "Message 1", 
     "messageTime": "2014-05-19T11:03:32.707957-04:00", 
     "status": true 
    }, 
    { 
     "userId": "00000000-0000-0000-0000-000000000000", 
     "subject": "new message 2", 
     "messageText": "Message 2", 
     "messageTime": "2014-05-19T11:03:32.707957-04:00", 
     "status": true 
    }, 
    { 
     "userId": "00000000-0000-0000-0000-000000000000", 
     "subject": "new message 3", 
     "messageText": "Message 3", 
     "messageTime": "2014-05-19T11:03:32.707957-04:00", 
     "status": true 
    } 
] 

爲什麼當我使用任務並沒有得到回來之後通過測試呼叫直接返回瀏覽器到webapi服務?

編輯1

更改方法來這個......還是坐在旋轉它的輪子出於某種原因

[AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public async Task<List<UserNotifications>> GetNotifications() 
    { 
     Task<List<UserNotifications>> userNotList = new Task<List<UserNotifications>>(() => new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }); 
     return await userNotList; 
    } 

然而,當我改成了這個......

[AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public Task<List<UserNotifications>> GetNotifications() 
    { 
     var newstring = ""; 
     List<UserNotifications> userNotList = new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }; 

     return Task.FromResult(userNotList); 
    } 

它返回的結果很好......任何人都可以澄清這些方法之間的區別。我冒險進入Task,asnyc的領地,等待着,但我仍然需要能夠使用類似POSTMan的方式直接測試Webapi的調用。

EDIT 2 以下變化的兩個工作...

[AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public Task<List<UserNotifications>> GetNotifications() 
    { 
     var userNotList = Task.Run(
       () => new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }); 

     return userNotList; 
    } 

    [AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public async Task<List<UserNotifications>> GetNotifications() 
    { 
     var userNotList = Task.Run(
       () => new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }); 

     return await userNotList; 
    } 
+1

嘗試「return await userNotList;」 – Ishtiaq

+1

...也許使方法'async'。那麼它應該工作。 –

+0

你究竟在做什麼?如果你有(同步)數據要返回,只需同步返回(不包含在任務中)。 –

回答

3

創建任務,但還沒有真正開始它,嘗試更換你的任務建構:

Task<List<UserNotifications>> userNotList = new Task<List<UserNotifications>>(... 

下列要求:

var userNotList = Task<List<UserNotifications>>.Run(
        () => new List<UserNotifications>{...}); 

更新與編輯的例子

  1. 問題,在您添加async/await是一樣的,你創建,知道該怎麼做Task對象,但你實際上並不告訴開始做那個工作Run方法。
  2. 在使用Task.FromResult(userNotList)的第二個示例中,您已經獲得了結果列表,並將它簡單包裝到完成的Task中並將其返回。

有關該主題的更多信息,我強烈建議您閱讀Task-based Asynchronous Pattern

+2

技術上正確,但不應在ASP.NET上使用'Task.Run'。 –

+0

谷歌搜索'task.run asp.net'並找到你的博客文章 - 有趣的閱讀,謝謝。 – Yuriy