- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 BackgroundWorker
来完成一项任务。我已经让 worker 正确运行,在 DoWork
方法下它然后调用另一个执行的方法但后来我遇到了我的问题:当该方法试图调用另一个方法时它没有成功并且没有抛出一个异常,我只能认为这是我在 BackgroundWorker
上做错的事情,因为在 UI 线程上运行以测试方法是否按预期执行。
这是我运行 worker 的地方:
private void btnAddShots_Click(object sender, EventArgs e)
{
backgroundWorker.RunWorkerAsync();
}
这是我的 DoWork
方法:
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
int noOfShots = dataGridShots.Rows.Count - 1;
int count = 0;
while (count < noOfShots)
{
addTaskPair(dataGridShots.Rows[count].Cells[0].Value.ToString(),
dataGridShots.Rows[count].Cells[1].Value.ToString(),
dataGridShots.Rows[count].Cells[2].Value.ToString());
count += 1;
}
}
这是我的工作人员调用的 addTaskPair
方法的精简版:
private void addTaskPair(string taskName, string taskDescription, string taskPriority)
{
try
{
Task trackingTask = new Task();
trackingTask.content = taskName;
trackingTask.description = taskDescription;
trackingTask.priority = taskPriority;
string trackingJson = JsonConvert.SerializeObject(trackingTask);
trackingJson = "{ \"todo-item\":" + trackingJson + " }";
string jsonResponse;
jsonResponse = postJSON(trackingJson, teamworkURL + "/tasklists/"
+ todoLists.todoLists[cmbTrackingList.SelectedIndex].id + "/tasks.json");
}
catch (Exception e)
{
debugMessage(e.ToString());
}
}
在上面的示例中,您会看到我调用了方法 postJSON
,这就是我碰壁的地方。通过测试,我已经验证了上述方法运行,但是从该线程中调用时 postJSON
方法根本不运行。
在研究这个问题时,我已经看到很多关于 Invoking
的引用,但它们似乎都适用于更改我不需要做的 ui 控件(尽管进度条是使用 操作的) ProgressChanged
BackgroundWorker
事件)。
如果需要,我可以进一步澄清我的问题,但我真的希望得到这方面的帮助,因为我以前从未成功地使用过 backgroundworker 或线程(我不是专业人士,我相信你可以从我的代码中看出) .
最佳答案
您正在使用 BackgroundWorker.DoWork
事件处理程序中的 UI 控件。不要那样做。
在启动 BackgroundWorker
之前收集数据,并将其作为参数传递给 RunWorkerAsync
方法。不要触摸 BackgroundWorker.DoWork
中的 UI - 通过 ReportProgress
方法更新进度是可以的。
此外,如果您在 .NET 4.5+ 上运行,您可能需要考虑改用新的 Task
模式。它仍然需要您事先收集数据进行处理,但使用起来要容易得多:
(编辑:正如 Peter 所建议的,无效访问发生在 cmbTrackingList.SelectedIndex
中;我已将其包含在下面的代码中。这正是我建议的原因对发生在单独线程中的操作使用 static
方法 - 这会让您对正在处理的数据有更多的思考)
var todoList = todoLists.todoLists[cmbTrackingList.SelectedIndex];
var data =
dataGridShots
.Rows
.Select
(
i =>
new
{
TaskName = i.Cells[0].Value.ToString(),
TaskDescription = i.Cells[1].Value.ToString(),
TaskPriority = i.Cells[2].Value.ToString()
}
)
.ToArray();
var result =
await Task.Run
(
() =>
foreach (var row in data)
handleRowData(row.TaskName, row.TaskDescription, row.TaskPriority, todoList)
);
既然你已经走到这一步了,你可能会注意到让你的 postJson
方法异步也不难(有很多方法可以异步发出 HTTP 请求)——这个将允许您在不阻塞任何线程的情况下使整个代码异步。
多线程困难。始终尝试使用尽可能高的抽象,并避免任何共享状态。如果您确实需要共享状态,您需要同步每个线程对它的每次访问 - 尽量避免这种情况(一个好的做法是让方法在不同的线程上执行 static ,这样你就不会不小心触及共享状态)。
关于c# - 从 DoWork 处理程序调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29079330/
我使用的 BackgroundWorker 与以前有点不同。 通常,我使用 BW 来更新一些图形控件,我在 DoWork 方法中执行所有需要的任务,返回结果并为 RunWorkerCompleted
我正在尝试使用 WorkManager 中的 PeriodicWorkRequest 定期从远程 url 获取数据。我已经实现了逻辑,这里的问题是我没有从 Worker 得到任何响应。 但是它似乎在第
这个问题已经以不同的形式被问过很多次,但我没有回答正确,想知道它是否可能不是一个 android 错误。 设置 WorkManager 后,doWork() 会随机调用,有时会连续调用多达 10 次以
我正在寻找在后台线程中运行顺序子过程。我想知道是否可以这样做,方法是创建一个后台工作程序,然后像这样分别调用每个过程... Private Sub BGW_DoWork(ByVal sender As
我正在尝试使用 BackgroundWorker 来完成一项任务。我已经让 worker 正确运行,在 DoWork 方法下它然后调用另一个执行的方法但后来我遇到了我的问题:当该方法试图调用另一个方法
在下面的代码中,有没有一种方法可以不总是订阅 updateWorker_DoWork 方法,而是将它传递给这样的方法 public void GetUpdates(SomeObject blah) {
我正在编写一个基于表单的小型应用程序来连接到 LDAP 服务器,我希望“连接”按钮在后台工作。所以我关注信息和讨论 here 但无论出于何种原因,我的代码似乎都无法正常工作:我在“worker.Run
我正在尝试使用 WorkManager 进行服务器调用。所以,我写了下面的 Worker 类: class ServerCallWorker extends Worker { publ
我想计划任务在 24 小时后从数据库中删除 public class WorkManager extends Worker { public WorkManager(@NonNull Cont
我正在运行一个 BackgroundWorker 线程来完成一项耗时的任务。耗时的任务在另一个类(class)。我需要将在 BackgroundWorker 上运行的这个单独类所取得的进展传递回 Ma
我正在运行一个 BackgroundWorker 线程来完成一项耗时的任务。耗时的任务在另一个类(class)。我需要将在 BackgroundWorker 上运行的这个单独类所取得的进展传递回 Ma
我的问题如下: 我有一个窗口窗体,其中放置了一个 LayoutPanel,当窗体加载时,多个控件,如:文本框和标签被添加到 LayoutPanel。 然后单击按钮,我需要处理用户在那些动态创建的控件上
private void button_uploadToPI_Click(object sender, RoutedEventArgs e) { this.newFilePat
在 form1 之上 label5.Text = "00:00:00"; 在dowork事件中 private void backgroundWorker1_DoWork(object sender,
在我们基于 .NET Framework 的应用程序中,我们使用 BackgroundWorker 保存了一个巨大的文件保持 UI 响应。当我们关闭它时,我们不想停止后台工作(默认行为)并截断文件。
我正在使用后台工作程序来处理文件的加载以阻止我的用户界面卡住,但是似乎 RunWorkerCompleted 在我的 DoWork 事件发生之前完成已完成(退出对话框时导致错误)...我做错了什么吗?
假设我有一个 backgroundWorker1_DoWork,它在数据库中找到一个值并在 e.Result 中返回它。假设我还有一个读取结果的 backgroundWorker1_RunWorker
这是我的设置,这段代码可以正常工作 private void butGo_Click(object sender, EventArgs e) { threadCreateImages.RunWor
我知道 C# 主程序的堆栈大小为 1 MB(32 位和任何)或 4 MB(64 位),请参阅 Why is stack size in C# exactly 1 MB? BackgroundWorke
首先,我贴出我的代码: public partial class MainWindow : Window { private readonly BackgroundWorker worker
我是一名优秀的程序员,十分优秀!