1

初めてのスタックオーバーフロー。

わかりましたので、クラスプロジェクト用に作成しているこのアプリがあり、Windows Phone 8 の投稿要求を実装しようとしています。私は C# と Windows Phone 開発の初心者です。これは私の最初の試みですが、プログラミングの原則をよく理解しています。

問題は、postData でテキスト ボックスの Text プロパティを割り当てる直前または直後に、Visual Studio がデバッガ コンソールでいくつかの例外を返すことです。

なぜこれが起こるのか、そして/または何が起こっているのかを理解するために私が勉強すべきC#/ Windows Phone Devの資料を理解するのを手伝ってくれる人はいますか?

どんな助けでも大歓迎です-事前にThnx。

An exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll and wasn't handled before a managed/native boundary
A first chance exception of type 'System.UnauthorizedAccessException' occurred in System.Windows.ni.dll
An exception of type 'System.UnauthorizedAccessException' occurred in System.Windows.ni.dll but was not handled in user code

これがコードです。

using System;
    using System.Diagnostics;
    using System.Text;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Navigation;
    using Microsoft.Phone.Controls;
    using Microsoft.Phone.Shell;
    using PhoneApp1.Resources;

    namespace PhoneApp1
    {
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {

            InitializeComponent();

        }

        private void ButtonFuction(object sender, RoutedEventArgs e)
        {

            var request = HttpWebRequest.Create("http://www.foo.com") as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

        }

        private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
            // End the stream request operation
            Stream postStream = request.EndGetRequestStream(asynchronousResult);

            // Create the post data
            string postData = "blah=" + textBlock1.Text + "&blah=" + textBlock2.Text + "&blah=moreblah";

            byte[] byteArray = Encoding.UTF8.GetBytes(postData);


            postStream.Write(byteArray, 0, byteArray.Length);
            postStream.Close();

            //Start the web request
            request.BeginGetResponse(new AsyncCallback(GetResponceStreamCallback), request);

        }

        void GetResponceStreamCallback(IAsyncResult callbackResult)
        {
            HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
            using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()))
            {
                string result = httpWebStreamReader.ReadToEnd();
                //For debug: show results
                Debug.WriteLine(result);
            }

        }

    }
}
4

2 に答える 2

1

まず、この種の状況 (ハンドルされない例外) に遭遇したときはいつでも、それをキャッチして調べてください。

try
{
    // code poops exception
}catch(Exception ex)
{
    // place a breakpoint below
    var thisIsAllYouNeed = ex.ToString();
}

例外、すべての内部例外、およびそこからのスタック トレースを取得します。それを poopy コードと一緒に質問に貼り付ければ、ほとんどの場合、答えが得られます (自分で理解できない場合)。

問題は、ネットワークを使用する必要があることを指定していないことです。電話の所有者に何をしようとしているのかを伝えずに、地理位置情報、ネットワーク、SMS などのリソースを手に入れることはできません。そうしないと、あなたが私のかわいい猫のアプリを楽しんでいる間に、あなたの連絡先リストをロシアの私のサーバーに送信することになります.

そのため、アプリのマニフェスト ファイルを編集し、アプリが動作するために必要な電話上のすべての管理対象リソースを指定する必要があります。すべての保護されたリソースのリストは、こちらで確認できます。それを読んで、アプリが何を使用しているかを確認してください。


さて、本当の問題はスレッド化であることがわかりました。非同期操作は 1 つのスレッドで開始され、(通常は余分な作業を行わずに) 別のスレッドで終了します。したがってButtonFuction、1 つのスレッド (UI スレッド) で開始されGetRequestStreamCallback、別のスレッドで実行されます。

UI 要素には「スレッド アフィニティ」があります。つまり、UI スレッドで実行されているコードによってのみ操作できます。その理由を探っていきます。textBlock1.TextUIスレッドではないスレッドでUI 要素 ( ) に触れようとしています。したがって、修正はそれをやめることです。

ああ、どうやって?いくつかの異なる方法。UI スレッドを使用して UI スレッドDispatcher上でメソッドを呼び出すこともできますが、バックグラウンド スレッドの作業がすべて完了するまで、これを保留する必要があります。したがって、これをできるだけ簡単にするために、UI スレッドでコンテンツを読み取り、それを一時変数にスローして、バックグラウンド スレッドで読み取ります。

    private void ButtonFuction(object sender, RoutedEventArgs e)
    {

        // Create the post data
        _lolThreading = "blah=" + textBlock1.Text + "&blah=" + textBlock2.Text + "&blah=moreblah";

        var request = HttpWebRequest.Create("http://www.foo.com") as HttpWebRequest;
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

    }

    private string _lolThreading;

    private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        // End the stream request operation
        Stream postStream = request.EndGetRequestStream(asynchronousResult);

        // avoid bad-touching UI stuff
        byte[] byteArray = Encoding.UTF8.GetBytes(_lolThreading);

        postStream.Write(byteArray, 0, byteArray.Length);
        postStream.Close();

        //Start the web request
        request.BeginGetResponse(new AsyncCallback(GetResponceStreamCallback), request);

    }

ここで、 (に何かを投げる代わりにDebug)完了したらおそらく UI スレッドをスキップして戻りたいと思うでしょう。最初に呼び出す方法を研究する必要があります)。DispatchertextBlock1.DispatcherInvoke(() => textBlock1.Text = "some result etc");

于 2013-09-17T19:09:41.907 に答える
0

ここでの回答のおかげで、アプリに必要なすべての機能を入れていないことがわかりました。

これがいつ発生したかを調査する方法を学びました:)

ありがとう!!!

于 2014-01-16T05:57:38.797 に答える