我有一个线程是在打开一个新的表单实例时创建的。 这个线程应该在这个表单打开时随时运行。 表单关闭后,它应该死亡。关闭表单后关闭线程?
问题是当我打开同一个窗体的新实例时,它使用相同的线程。
我在寻找正确的代码可能是某处的这个我想行......除了这是无效的:
t = new Task(Task.Factory.StartNew(() => totalDistance()));
这里是整个代码: 方法WindowsFormClosing可能不必要的,但我没有想法。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ITS3_Eksamen_F2014_201270810
{
public partial class DistanceForm : Form
{
Data dat;
private string name;
Task t;
private bool killThread;
public DistanceForm(Data d, string n)
{
dat = d;
name = n;
InitializeComponent();
getDistance(name);
nameLabel.Text = name;
t = Task.Factory.StartNew(() => totalDistance());
killThread = false;
}
private void getDistance(string name)
{
var dList = new List<Distance>();
dList = dat.getDistance(name);
int i = 0;
dataGridView1.Rows.Clear();
foreach (Distance dist in dList)
{
dataGridView1.Rows.Add();
dataGridView1.Rows[i].Cells[0].Value = dist.getTid();
dataGridView1.Rows[i].Cells[1].Value = dist.getAngivelse();
dataGridView1.Rows[i].Cells[2].Value = dist.getLængde();
dataGridView1.Rows[i].Cells[3].Value = dat.getFullName(dist.getInitialer());
i++;
}
}
private void updateInitials(string initialer, int rowNumber)
{
dataGridView1.Rows[rowNumber].Cells[3].Value = dat.getFullName(initialer);
}
private void buttonAdd_Click(object sender, EventArgs e)
{
int rowNumber = dataGridView1.CurrentCell.RowIndex;
if (!dataGridView1.Rows[rowNumber].Cells[0].Value.ToString().Equals("")
&& !dataGridView1.Rows[rowNumber].Cells[1].Value.ToString().Equals("")
&& !dataGridView1.Rows[rowNumber].Cells[2].Value.ToString().Equals("")
&& !dataGridView1.Rows[rowNumber].Cells[3].Value.ToString().Equals(""))
{
var tid = dataGridView1.Rows[rowNumber].Cells[0].Value.ToString();
var længde = dataGridView1.Rows[rowNumber].Cells[1].Value.ToString();
var angivelse = dataGridView1.Rows[rowNumber].Cells[2].Value.ToString();
var initialer = dataGridView1.Rows[rowNumber].Cells[3].Value.ToString();
dat.addDistance(name, tid, længde, angivelse, initialer);
}
else
{
MessageBox.Show("Du skal udfylde alle felter!");
}
int currentRow = dataGridView1.CurrentCell.RowIndex;
string currentRowInitialer = dataGridView1.Rows[currentRow].Cells[3].Value.ToString();
updateInitials(currentRowInitialer, currentRow);
}
private void buttonRemove_Click(object sender, EventArgs e)
{
int number = dataGridView1.CurrentCell.RowIndex;
dat.deleteDistance(name, number);
}
private void totalDistance()
{
while (killThread == false)
{
int totalDist = 0;
int newDist = 0;
var testList = dat.getDistance(name);
foreach (Distance dist in testList)
{
newDist = Convert.ToInt32(dist.getLængde().Replace(" km", ""));
totalDist = totalDist + newDist;
}
this.BeginInvoke((Action)(() =>
{
textBox1.Text = Convert.ToString(totalDist) + " km";
}));
}
}
private void WindowsFormClosing(object sender, FormClosingEventArgs e)
{
killThread = true;
}
}
}
在此先感谢!
“一个相同形式的新实例” - >你可能想说,你再次打开*相同的Form实例*。 – BartoszKP
@BartoszKP是对的。你应该知道'Tasks'正在使用'ThreadPool',并且'ThreadPool'上的线程正在被重用。对于长时间运行的任务,你应该使用'var task3 = Task.Factory.StartNew(()=> totalDistance(),TaskCreationOptions.LongRunning);'然后它将构造新的线程。 (重用线程没有任何错误..) –
不错的命名空间:ITS3_Eksamen_F2014_201270810 lol –