Unauthorizedaccessexception:如何等待用户的输入。Windows Phone c#

Unauthorizedaccessexception:如何等待用户的输入。Windows Phone c#,c#,multithreading,windows-phone,C#,Multithreading,Windows Phone,在这里,我正在创建一个简单的windows phone应用程序来模拟猜谜游戏。我有一个while循环来运行游戏,直到用户猜到正确的答案;我想做的是在每个循环的开始,等待用户在文本框中按enter键触发事件。我对这个想法不熟悉,在多线程方面没有经验。 我收到一个未经授权的访问异常,我不确定是什么原因导致它 public partial class MainPage : PhoneApplicationPage { Random r; int guess; static Au

在这里,我正在创建一个简单的windows phone应用程序来模拟猜谜游戏。我有一个while循环来运行游戏,直到用户猜到正确的答案;我想做的是在每个循环的开始,等待用户在文本框中按enter键触发事件。我对这个想法不熟悉,在多线程方面没有经验。 我收到一个未经授权的访问异常,我不确定是什么原因导致它

public partial class MainPage : PhoneApplicationPage
{
    Random r;
    int guess;
    static AutoResetEvent autoEvent;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
        r = new Random();
        autoEvent = new AutoResetEvent(false);
        Thread t = new Thread(PlayGuessGame);
        t.Start();
    }

    private void PlayGuessGame()
    {
        bool hasWon = false;
        int secretNumber = r.Next(1, 3);
        int tries = 1;

        messageTextBox.Text = "Guess a number";

        while (!hasWon)
        {
            autoEvent.WaitOne();
            if (guess == secretNumber) //if user wins
            {
                messageTextBox.Text = "Congratulations! You've guess the correct number! It took {0} tries.";

            }
            else
            {
                tries++;
                if (guess < secretNumber)
                    messageTextBox.Text = "Guess higher!";
                else
                    messageTextBox.Text = "Guess lower!";

                lastGuessTextBox.Text = guess.ToString();
            }

        }
    }

    private void guessTextBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {
            guess = int.Parse(guessTextBox.Text);
            autoEvent.Set();
        }
    }

}
public部分类主页:PhoneApplicationPage
{
随机r;
智力猜测;
静态自动resetevent自动事件;
//建造师
公共主页()
{
初始化组件();
r=新随机数();
autoEvent=新的AutoResetEvent(假);
线程t=新线程(PlayGuessGame);
t、 Start();
}
私人void PlayGuessGame()
{
布尔·哈斯旺=假;
int secretNumber=r.Next(1,3);
int=1;
messageTextBox.Text=“猜一个数字”;
而(!哈斯旺)
{
autoEvent.WaitOne();
if(guess==secretNumber)//如果用户赢了
{
messageTextBox.Text=“祝贺您!您猜对了数字!尝试了{0}。”;
}
其他的
{
尝试++;
如果(猜测
您遇到的问题是,您试图从一个非创建对象的线程访问该对象。因此,运行PlayGuessGame()的线程不应该在该沙箱中运行。不过,您可以通过使用MethodInvorder绕过此问题:

        private void PlayGuessGame()
    {
        bool hasWon = false;
        int secretNumber = r.Next(1, 3);
        int tries = 1;

        messageTextBox.Text = "Guess a number";

        while (!hasWon)
        {
            autoEvent.WaitOne();
            if (guess == secretNumber) //if user wins
            {
                this.Invoke(new MethodInvoker(delegate { messageTextBox.Text = "Congratulations! You've guess the correct number! It took {0} tries."; }));

            }
            else
            {
                tries++;
                if (guess < secretNumber)
                    this.Invoke(new MethodInvoker(delegate { messageTextBox.Text = "Guess higher!"; }));
                else
                    this.Invoke(new MethodInvoker(delegate { messageTextBox.Text = "Guess lower!"; }));

                this.Invoke(new MethodInvoker(delegate { lastGuessTextBox.Text = guess.ToString(); }));
            }

        }
    }
private void PlayGuessGame()
{
布尔·哈斯旺=假;
int secretNumber=r.Next(1,3);
int=1;
messageTextBox.Text=“猜一个数字”;
而(!哈斯旺)
{
autoEvent.WaitOne();
if(guess==secretNumber)//如果用户赢了
{
this.Invoke(newmethodinvoker(delegate{messageTextBox.Text=“恭喜!您猜对了!尝试了{0}次。”;}));
}
其他的
{
尝试++;
如果(猜测

我绝对推荐Brian Warshaw的评论,这应该是一个事件驱动的GUI。希望这有帮助,但是,你可以在其他地方使用这个你正在使用的线程

您介意添加您正在接收的堆栈跟踪吗?在visual Studio中从哪里获取堆栈跟踪?为什么在GUI应用程序中使用这样的循环?为什么不管理游戏的状态,只处理按钮按下事件呢?你的右边的Brian,我应该使用偶数处理程序来控制。但是当我在这里思考的时候,我想了解我的问题是什么,这样我就能提高我的知识。