2010-09-23 123 views
0

我有一个SilverLight按钮,它可以从文本框中获取注释以保存在我的数据库中,然后关闭窗口。将数据从SilverLight发送到MVC控制器的间歇性功能

的SilverLight:

Task task = new Task(); 
private void saveChangeBtn_Click(object sender, RoutedEventArgs e) 
{ 
    string commentTxtBxValue = commentTxtBx.Text; 
    task.SaveComment(commentTxtBx.Text); 
    commentTxtBx.Text = commentTxtBxValue; 

    HtmlPage.Window.Invoke("closeWindow", null); 
} 

Silverlight的调用我的Silverlight项目中它创建了一个URI,并使用这个URI模式SaveComment(),它发送注释文本到我的MVC控制器。

型号代码:

public void SaveComment(string Comment)  
{  
    // Create post string  
    StringBuilder postData = new StringBuilder();  
    postData.AppendFormat("?{0}={1}", "id", this.PageBreakId);  
    postData.AppendFormat("&{0}={1}", "comment", Comment);  


    string dataString = postData.ToString();  
    byte[] data = Encoding.UTF8.GetBytes(dataString);  

    // Configure client  
    WebClient client = new WebClient();  
    client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);  
    client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted);  

    string baseUri = HtmlPage.Document.DocumentUri.ToString().ToLower();  
    baseUri = baseUri.Substring(0, baseUri.IndexOf("currentPage"));  

    Uri uri = new Uri(baseUri + "SaveComment", UriKind.Absolute);  

    try  
    {  
     // Start upload   
     client.UploadStringAsync(uri, dataString);  
    }  
    catch (Exception e)  
    {  
     System.Diagnostics.Debug.WriteLine(e.Message);  
    }  
} 

最后,我的MVC控制器将其保存到数据库中。

MVC控制器:

[AcceptVerbs(HttpVerbs.Post)]  
public ActionResult SaveComment()  
{  
    //Save to Database  
} 

我的问题是,现在看来,我的Silverlight的代码HtmlPage.Window.Invoke("closeWindow", null);关闭页面结束代码执行它有机会完成之前。如果我在我的MVC控制器上放置一个断点,它只会有时被触发。我注意到FireFox几乎总是会打到它,但IE8几乎从未打过它。

在关闭页面之前,我可以做些什么来确保我的代码完成?

谢谢

亚伦

回答

0

你`WebClient.UploadStringAsync”是一个平行的方法。一旦你的代码到达那里,它就会移动到程序的其余部分,这就是为什么在它有机会执行其内部代码之前它可能会关闭窗口代码。

分辨率

  1. 在你Task类中,实现一个事件并调用它的UploadStringCompleted回调中。然后在您的主代码内触发此事件并激发关闭窗口代码时进行监听。
  2. 另一种方法是在Task类中将您的关闭窗口代码放入UploadStringCompleted(可能是糟糕的设计)中。
+0

你是不是指UploadStringCompleted事件? – 2010-09-23 14:44:05

0

正如你可以/ maynot有足够的执行时间,以完成上传(因为它的异步因此继续执行执行到达,而不是等待和程序退出UploadStringAsync后)

MSDN中有这样一段对WebClient的说.UploadStringAsync ..

将指定的字符串上传到指定的资源。这些方法不会阻止调用线程

有一个事件UploadStringAsync确定何时上传完成后, 其WebClient.UploadStringCompleted事件

MSDN中有这样一段对WebClient的说。UploadStringCompleted事件

当异步字符串上传操作完成时发生。

您可以在其中关闭页面。即在事件处理程序中调用以下内容。

HtmlPage.Window.Invoke("closeWindow", null); 
相关问题