17

MVC 4.0 アプリケーションで奇妙な問題が発生しました。REST Web サービス (Amazon アソシエイト) を使用しています。どこからでも使用できるメソッドを作成しました。短縮版は次のとおりです。

    private async Task<XElement> GetRequest(string url)
    {
        string myresponse;
        HttpResponseMessage response = null;
        HttpClient client = new HttpClient();            
        try
        {
            response = await client.GetAsync(url);
            myresponse = response.Content.ToString();
            if (myresponse.Contains("503"))
            {
                myTrace.WriteLine("503 Sleep.....");
                Thread.Sleep(3000); // looks like amazon us does not like fast requests....
                return await GetRequest(url); //restart after pausing....
            }
        }
        catch (TaskCanceledException ex)
        {
            myTrace.WriteLine("TaskCancelled From GetRequest: " + ex);
            return null;
        }

        catch (HttpRequestException ex)
        {
            myTrace.WriteLine("RequestException Sleep.....");
            Thread.Sleep(300000); // 5 minutes de pause 
        }

        catch (Exception ex)
        {
            myTrace.WriteLine("From GetRequest: " + ex);
            return null;
        }

        try
        {
            XElement content = await response.Content.ReadAsAsync<XElement>();
            response.Dispose();
            client.Dispose();
            return content;
        }
        catch (Exception)
        {
            return null;
        }
    }

派手なことは何もありません、それは完全にうまく機能します....しかし、今、特定の呼び出しで、それは爆撃しclient.GetAsync(url)ます. 最初は、URL の何かが間違っているのではないかと疑ったので、デバッガー セッションからそれを取得し、ブラウザーに直接貼り付けたところ、期待どおりの答えが得られました...

したがって、URL に問題はありません。少し単体テストを行い、同じ特定の URL で問題なく動作します...

デバッガーで爆撃するため、何が問題なのかを確認するのは困難です。(スローされる例外はありません!)。最後に、IntelliTrace を使用して、一見内部に例外があることを確認しましたSystem.Threading.Tasks。呼び出しスタックは私の非専門家の目に少し混乱しているため、ポイントを特定するのは困難です....

コードの前のパスから取得したコール スタックを次に示します。

>   System.Web.dll!System.Web.ThreadContext.AssociateWithCurrentThread(bool setImpersonationContext = {unknown})    C#
System.Web.dll!System.Web.HttpApplication.OnThreadEnterPrivate(bool setImpersonationContext = {unknown})    C#
System.Web.dll!System.Web.HttpApplication.OnThreadEnter()   C#
System.Web.dll!System.Web.HttpApplication.System.Web.Util.ISyncContext.Enter()  C#
System.Web.dll!System.Web.Util.SynchronizationHelper.SafeWrapCallback(System.Action action = {unknown}) C#
System.Web.dll!<>c__DisplayClass9.AnonymousMethod(System.Threading.Tasks.Task _ = {unknown})    C#
mscorlib.dll!System.Threading.Tasks.ContinuationTaskFromTask.InnerInvoke()  C#
mscorlib.dll!System.Threading.Tasks.Task.Execute()  C#
mscorlib.dll!System.Threading.Tasks.Task.ExecutionContextCallback(object obj = {unknown})   C#
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown}, bool preserveSyncCtx = {unknown})   C#
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext = {unknown}, System.Threading.ContextCallback callback = {unknown}, object state = {unknown}, bool preserveSyncCtx = {unknown})   C#
mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref System.Threading.Tasks.Task currentTaskSlot = {unknown})    C#
mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry(bool bPreventDoubleExecution = {unknown}) C#
mscorlib.dll!System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() C#
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()    C#
mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() C#

とにかく、これはタスク、非同期、バックグラウンドワーカーなどに確実にリンクされているように見えます...この問題を回避するために、実行中の他のすべてのタスクを「クリア」する良い方法はありますか?

助けてくれてありがとう、バーナード。

4

3 に答える 3

7

見た目からすると、最初の try ブロックからの例外イベントでスリープ状態になったスレッドの 1 つが解決される前にコードが完了する可能性があるため、5 分後にスレッドが起動した後、再結合する元のスレッドがなくなり、 AssociateWithCurrentThread からの NullReferenceException

于 2013-05-17T19:01:45.353 に答える
0

上記の例外とコール スタックが表示されたのは、非同期を使用して「ファイア アンド フォーゲット」を実行しようとしたためでした。これは非常に悪い考えでした。必要なもののために新しいスレッドの紡績に切り替えたところ、クラッシュはなくなりました。

于 2014-04-08T22:38:39.230 に答える