从txt文件加载URL并在浏览器同步WebClient httpRequest中加载URL [英] Load URL from txt File and load the URL in Browser Synchronous WebClient httpRequest

查看:69
本文介绍了从txt文件加载URL并在浏览器同步WebClient httpRequest中加载URL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从Microsoft的以下示例开始Windows Phone编程:
http://code.msdn.microsoft.com/wpapps/Hybrid-Web-App-75b7ef74/view/SourceCode

I started Windows Phone programming with this example from Microsoft: http://code.msdn.microsoft.com/wpapps/Hybrid-Web-App-75b7ef74/view/SourceCode

The应用仅显示浏览器并加载URL。

The app only displays the browser and load a URL.

现在,我想直接从.txt文件加载另一个URL。
例如: http://www.test.de/appurl.txt 和然后我要在Windows Phone应用中加载URL。
->例如: http://anotherserver.de/index.html?mobileApp

Now I want to load an other URL directly from a .txt file. For example: http://www.test.de/appurl.txt and then I want to load the URL in the Windows Phone App. --> For example: http://anotherserver.de/index.html?mobileApp

我的问题是URL必须同步加载而不是异步加载。我实现了AutoResetEvent,但是它不起作用...

My problem is, that the URL have to load synchronous and not asynchronous. I implement a AutoResetEvent, but it don´t work...

希望有人可以帮助我,谢谢!

Hope somebody can help me, thx!

这是我的代码:

    public partial class MainPage : PhoneApplicationPage
    {
        // URL zur WebApp
        // TODO: URL muss aus diesem TEXT-File ausgelesen werden!
        private string _appURL = "http://www.test.de/appurl.txt";

        public string _homeURL = "";
        //private string _homeURL = "http://anotherserver.de/index.html?mobileApp";

        // URL zur Registrierung von Angeboten 
        private string _registrationURL = "http://anotherserver.de/index.html?bereich=registrierung&mobileApp";

        // Secondary tile data
        //private Uri _currentURL;
        //private Uri _tileImageURL;
        //private string _pageTitle = "Shop ";

        // Serialize URL into IsoStorage on deactivation for Fast App Resume
        private Uri _deactivatedURL;
        private IsolatedStorageSettings _userSettings = IsolatedStorageSettings.ApplicationSettings;

        // To indicate when we're navigating to a new page.
        private ProgressIndicator _progressIndicator;


        // Constructor
        public MainPage()
        {
            InitializeComponent();
            //Read the URL from a txt file and set the _homeURL 
            ReadFile(_appURL);

            // Setup the progress indicator
            _progressIndicator = new ProgressIndicator();
            _progressIndicator.IsIndeterminate = true;
            _progressIndicator.IsVisible = false;
            SystemTray.SetProgressIndicator(this, _progressIndicator);

            // Event handler for the hardware back key
            BackKeyPress += MainPage_BackKeyPress;

            // Fast app resume events
            PhoneApplicationService.Current.Deactivated += Current_Deactivated;
            PhoneApplicationService.Current.Closing += Current_Closing;
        }


        //AutoResetEvent are = new AutoResetEvent(false);

        public void ReadFile(string address)
        {

            var webClient = new WebClient();
            webClient.OpenReadAsync(new Uri(address));
            webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);

            // lock the thread until web call is completed
            //are.WaitOne();

            //finally call the NotifyComplete method to end the background agent
            //NotifyComplete(); 
        }


        void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            try
            {
                using (var reader = new StreamReader(e.Result))
                {
                    string downloaded = reader.ReadToEnd();
                    Debug.WriteLine("downloaded= " + downloaded);
                    _homeURL = downloaded;
                    //work = false;
                }
            }
            catch
            {
                Debug.WriteLine("Please check your data connection");
                MessageBox.Show("Please check your data connection");
            }

              //signals locked thread that can now proceed
              //are.Set();
        }

        #region App Navigation Events

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            // Browser event handlers
            Browser.Navigating += Browser_Navigating;
            Browser.Navigated += Browser_Navigated;
            Browser.NavigationFailed += Browser_NavigationFailed;

            Browser.IsScriptEnabled = true;

            // Try to get the URL stored for fast app resume.
            try
            {
                _deactivatedURL = (Uri)(_userSettings["deactivatedURL"]);
            }
            catch (System.Collections.Generic.KeyNotFoundException keyNotFound)
            {
                Debug.WriteLine(keyNotFound.Message);
            }

            // Were we started from a pinned tile?
            if (NavigationContext.QueryString.ContainsKey("StartURL"))
            {
                // Navigate to the pinned page.
                Browser.Navigate(new Uri(NavigationContext.QueryString["StartURL"], UriKind.RelativeOrAbsolute));
            }
            else if ((_deactivatedURL != null) && (e.NavigationMode != NavigationMode.Reset))
            {
                // If there is a stored URL from our last 
                // session being deactivated, navigate there
                if (Browser.Source != _deactivatedURL)
                {
                    Browser.Navigate(_deactivatedURL);
                }
            }
            else
            {
                // Not launched from a pinned tile...
                // No stored URL from the last time the app was deactivated...
                // So, just navigate to the home page

                Browser.Navigate(new Uri(_homeURL, UriKind.RelativeOrAbsolute));
            }
        }

....


推荐答案


我的问题是,URL必须加载同步而不是异步

My problem is, that the URL have to load synchronous and not asynchronous

不,您无法同步执行操作,但是使用 async / await 您可以伪装它。

No you can't do it synchronously, but using async/await you can pretend it.

为此,您可以使用类似这样的方法(甚至可以将其编写为扩展方法)

For this, You can use a method something like this (you can even write it as an extension method)

await Navigate(webBrowser1, "http://stackoverflow.com");
DoSomethingAfterNavigationCompleted();







Task Navigate(WebBrowser wb,string url)
{
    var tcs = new TaskCompletionSource<object>();
    WebBrowserDocumentCompletedEventHandler documentCompleted = null;
    documentCompleted = (o, s) =>
    {
        wb.DocumentCompleted -= documentCompleted;
        tcs.TrySetResult(null);
    };

    wb.DocumentCompleted += documentCompleted;
    wb.Navigate(url);
    return tcs.Task;
}

这篇关于从txt文件加载URL并在浏览器同步WebClient httpRequest中加载URL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆