Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用HttpWebRequest.BeginGetResponse中的UI线程_C#_Wpf_Multithreading_Windows Phone_Httpwebrequest - Fatal编程技术网

C# 调用HttpWebRequest.BeginGetResponse中的UI线程

C# 调用HttpWebRequest.BeginGetResponse中的UI线程,c#,wpf,multithreading,windows-phone,httpwebrequest,C#,Wpf,Multithreading,Windows Phone,Httpwebrequest,晚安,我正在尝试调用UI线程,通过使用CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync方法在HttpWebRequest.BeginGetResponse方法中实际更新一个属性。但它不起作用,我不知道它实际上是如何起作用的。这是我的代码: private void DebutReponse(IAsyncResult resultatAsynchrone) { HttpWebRequest requete = (

晚安,我正在尝试调用UI线程,通过使用
CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync
方法在
HttpWebRequest.BeginGetResponse
方法中实际更新一个属性。但它不起作用,我不知道它实际上是如何起作用的。这是我的代码:

private void DebutReponse(IAsyncResult resultatAsynchrone)
    {
        HttpWebRequest requete = (HttpWebRequest)resultatAsynchrone.AsyncState;
        Stream postStream = requete.EndGetRequestStream(resultatAsynchrone);

        string donneesAEnvoyer = "username=" + Name + "&password=" + Password + "&email=" + Email;

        string lol = donneesAEnvoyer;
        byte[] tableau = Encoding.UTF8.GetBytes(donneesAEnvoyer);
        postStream.Write(tableau, 0, donneesAEnvoyer.Length);
        postStream.Close();
        requete.BeginGetResponse(FinReponse, requete);
    }

    private void FinReponse(IAsyncResult resultatAsynchrone)
    {
        HttpWebResponse aResp = null;
        try
        {
            HttpWebRequest requete = (HttpWebRequest)resultatAsynchrone.AsyncState;
            WebResponse webResponse = requete.EndGetResponse(resultatAsynchrone);
            Stream stream = webResponse.GetResponseStream();

            StreamReader streamReader = new StreamReader(stream);
            string reponse = streamReader.ReadToEnd();
            stream.Close();
            streamReader.Close();
            webResponse.Close();

            //ErrorGridHeight = new GridLength(0.3, GridUnitType.Star);
            ErrorMsg = msgSucceed;
         }
        catch (WebException e)
        {
            if (e.Response != null)
            {
                aResp = e.Response as HttpWebResponse;
            }
        }
        if (aResp != null)
            await errorFunc();
    }

    private async Task errorFunc()
    {
        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => ErrorMsg = msgFailed);
    }
我有一个错误,告诉我只能在返回任务的
异步方法中使用
wait
操作符。我不知道它是怎么工作的

编辑: 好的,所以我稍微修改了代码以避免此函数的问题:

requete.BeginGetResponse(FinReponse, requete);
因为她想要一个带有特定原型的函数,所以我这样做了:

private async Task lol(IAsyncResult resultatAsynchrone)
    {
        HttpWebResponse aResp = null;
        try
        {
            HttpWebRequest requete = (HttpWebRequest)resultatAsynchrone.AsyncState;
            WebResponse webResponse = requete.EndGetResponse(resultatAsynchrone);
            Stream stream = webResponse.GetResponseStream();

            StreamReader streamReader = new StreamReader(stream);
            string reponse = streamReader.ReadToEnd();
            stream.Close();
            streamReader.Close();
            webResponse.Close();

            //ErrorGridHeight = new GridLength(0.3, GridUnitType.Star);
            ErrorMsg = msgSucceed;
        }
        catch (WebException e)
        {
            if (e.Response != null)
            {
                aResp = e.Response as HttpWebResponse;
            }
        }
        if (aResp != null)
            await errorFunc();        
    }

    private void FinReponse(IAsyncResult resultatAsynchrone)
    {
        Task.Run(() => lol(resultatAsynchrone));
    }

    private async Task errorFunc()
    {
        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => ErrorMsg = msgFailed);
    }
唯一的问题是它不会改变属性,它不会进入我的属性集。我有一个解释是:

System.NotImplementedExection


谢谢您的帮助。

尝试将您的
errorFunc()
更改为此

private void errorFunc()
{
    CoreApplication.MainView.CoreWindow.Dispatcher.BeginInvoke(() =>
    {
        ErrorMsg = msgFailed;
    });
}
我还找到了另一个地方,在那里您试图在调用UI线程的情况下更改
ErrorMsg
。这是一行代码
ErrorMsg=msgSucceed。我建议使用相同的方法,因此将该行替换为:

CoreApplication.MainView.CoreWindow.Dispatcher.BeginInvoke(() =>
{
    ErrorMsg = msgSucceed;
});

您必须执行
finresponse
方法
async
,才能在其中使用
wait
运算符:


private async void FinReponse(IAsyncResult resultatAsynchrone)
因此我找到了访问UI的答案,我必须使用:

            Deployment.Current.Dispatcher.BeginInvoke(()=>mym());
而且它工作得很好。
谢谢你所做的一切。

“我不知道它是如何工作的”那么在这里问一个问题也许是个坏主意。最好先通过阅读在线文档、教程等来理解async/Wait。是的,我刚刚看过,但我不确定是否完全理解了示例中的所有步骤。我想通过练习来更好地理解。在我使用这种方法之前,但现在我改变了项目,我不确定它到底是什么,比如Silverlight应用程序,我不再有这种完美的BeginInvock方法。谢谢。是的,我试过了,但我想我不能改变它,因为这个方法:
requete.BeginGetResponse(FinReponse,requete)需要,思考,一个特定的原型,它不适合。