1

だから私は、SignalRとASP.NETAsyncに関するStevenSandersonのTechDaysTalkをフォローしてきました。次のアクションで問題が発生しました

public class SomeController : AsyncController
{
    static TaskCompletionSource<String> _nextMessage
        = new TaskCompletionSource<string>();

    [HttpPost]
    public ActionResult PostMessage(string message)
    {            
        _nextMessage = new TaskCompletionSource<string>();
        oldNextMessage.SetResult(message);
        return Content("success");
    }

    public async void GetMessages()
    {
        Response.ContentType = "text/event-stream";
        while (true)
        {
            var message = await _nextMessage.Task;
            Response.Write("data: " + message + "\n\n");
            Response.Flush();
        }

    }
}

GetMessagesは、最初に呼び出されたときはブロックしているように見えますが、タイムアウトすると、期待どおりに機能し始めます。

そこで、GetMessagesを投稿して実行するJavaScriptをロードします。GetMessagesの最初の呼び出しで、(予想どおりに)次の場所でハングします。

await _nextMessage.Task;

しかし、どこからでもPostMessageを呼び出すことはできません(ブラウザの他のインスタンスを含む)これは私の開発マシン上にあるため、スレッドの問題である可能性がありますが、これの全体的な目的はスレッドを許可することであると思いました複数のことに取り組むために。そして、それは、最初にタイムアウトした後、期待どおりに機能し始め、投稿してすぐに応答を得ることができるという点に加えてです。しかし、ページを更新すると、同じ問題が発生します。これを修正する方法について何かアイデアはありますか?ちなみに私はEventsourceを使用していますが、長いポーリングを行っている場合にも同じ問題が発生します。

    public async Task<string> GetNextMessage()
    {

        return await _nextMessage.Task;
    }

GetNextMessage()を呼び出すjavascriptループ関数を使用

4

1 に答える 1

1

これが私が使ってしまったものです

[SessionState(SessionStateBehavior.Disabled)]
public class SomeController : AsyncController
{
    static TaskCompletionSource<String> _nextMessage = 
        new TaskCompletionSource<string>();

    public void PostMessage(string message)
    {
        var CreationJObj = FormUtils.AsciiToJObject(Request.Form[0]);
        var CreationObj = FormUtils.FromJObject<MessageDisplayVO>(CreationJObj);
        Parallel.Invoke(() => { _nextMessage.SetResult(CreationObj.Message); });
        _nextMessage = new TaskCompletionSource<string>();

    }

    public async void GetMessages()
    {
        Response.ContentType = "text/event-stream";
        var oldMessage = _nextMessage;
        var message = await oldMessage.Task;
        Response.Write("data: " + message + "\n\n");
        Response.Flush();
    }
}
于 2013-01-11T16:11:55.173 に答える