2014-03-30 21 views
0

我想反序列化xml文件列表,我希望用戶能夠選擇要反序列化的文件。線程C#ASP.NET失去變量ASP.NET

static List<string> mylist = new List<string>(); 
string filename; 
protected void Page_Load(object sender, EventArgs e) 
{ 

} 
protected void Button1_Click(object sender, EventArgs e) 
{ 

    Thread newThread = new Thread(new ThreadStart(ThreadMethod)); 
    newThread.SetApartmentState(ApartmentState.STA); 
    newThread.Start(); 

} 
public void ThreadMethod() 
{ 
    OpenFileDialog dlg = new OpenFileDialog(); 
    dlg.ShowDialog(); 

    filename = dlg.FileName; 

} 

protected void ButtonDeserialize_Click(object sender, EventArgs e) 
{ 


    var serializer = new XmlSerializer(typeof(List<string>)); 
    using (var stream = File.OpenRead(filename)) 
    { 
     var other = (List<string>)(serializer.Deserialize(stream)); 
     mylist.Clear(); 
     mylist.AddRange(other); 
    } 
} 

線程結束後,文件名becomse爲null。 任何想法爲什麼會發生? 順便說一下,我不得不這樣做openfiledialog,因爲它是唯一對我有用的方法。 在此先感謝!

+0

無論如何,我真的不會使用多個線程進行UI工作 - 您可以在另一個線程中執行*反序列化*,但這是另一回事。你有沒有添加日誌記錄來檢查它是否真的到達'filename'賦值行?也許正在拋出異常? –

+6

等待,您正在Web應用程序上使用OpenFileDialog?武漢理工大學? – NothingsImpossible

+0

我真的很驚訝OpenFileDialog不會導致異常,或在Web應用程序中不能以另一種方式工作。無論如何,我不明白它是如何有用的。 – Stilgar

回答

0

替換此:

dlg.ShowDialog(); 
filename = dlg.FileName; 

這一點:

DialogResult result = dlg.ShowDialog(); 
if(result == DialogResult.OK) 
    filename = dlg.FileName; 
+0

沒有工作,仍然丟失變量文件名becomse null 「路徑不能爲空。 參數名稱:路徑「 – Biezor

+0

你的文件名是非易失性的,你沒有設置內存屏障 - 這很可能是變量在處理器內核緩存之間丟失。你需要設置內存屏障來同步緩存並聲明變量volatile 。最簡單:使用聯鎖方法寫入變量,設置隱式障礙。 – TomTom

-1

使用FileUploadControl解決的問題。在Web應用程序上更輕鬆,更完美。

protected void ButtonDeserialize_Click(object sender, EventArgs e) 
{ 

    if (FileUploadControl.HasFile) 
    { 
     try 
     { 
      filename = Path.GetFileName(FileUploadControl.FileName); 
      pathname = Path.GetDirectoryName(filename); 
     } 
     catch (Exception ex) 
     { 
      LabelMessage.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 
     } 
    } 
+0

考慮在答案中添加一些代碼。 – Beryllium

+0

添加了一些代碼來回答。 – Biezor