winform中的多线程问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform中的多线程问题相关的知识,希望对你有一定的参考价值。

我有一个方法getcounts()
void getcoutes()

int i = 0;
while(ture)

textbox1.text = i.tostring();
i++;



然后我要建立一个线程,来完成这个方法
效果是textbox中的值从显示1开始 一个一个加上去显示,值不停的在变

给个解决方案,参考:
public delegate void ChangeTextCallBack(string value);
private void ChangeText(string value)

if (this.textbox1.InvokeRequired)

ChangeTextCallBackd = new ChangeTextCallBack(ChangeText);
this.textbox1.Invoke(d, new object[] value);

else

this.textbox1.Text= value;



private void getcoutes()

int i = 0;
while(ture)

ChangeText( i.tostring());
i++;
Thread.Sleep(200);



再这样调用,启动线程:
Thread tdr = new Thread(getcoutes);
tdr.Start();追问

这个情况不用调试,我就可以确定,会现在线程之间不能进行操作。

追答

线程之间操作???

参考技术A Thread t=new Thread(new ThreadStart(getcoutes));
t.start();

但是要在程序中加
Form.CheckForIllegalCrossThreadCalls = false;
这句话,否则会报线程间调用错误,不是创建控件的线程操作控件。追问

这样会很麻烦的,如果别人调用的话,会出现重大错误的。。。。。。。

参考技术B Thread tdr = new Thread(getcoutes);
tdr.Start();追问

这样又不会显示不停的加,textbox中什么值都不会显示的好不。。。。。

追答

在构造函数中加上TextBox.CheckForIllegalCrossThreadCalls = false;
这个是关闭对文本框的跨线程操作检查的,不然textbox中的值是不会不停的添加的

NSFetchedResultsController,后台线程中的多线程和删除

【中文标题】NSFetchedResultsController,后台线程中的多线程和删除【英文标题】:NSFetchedResultController, Multithreading and deletion in background thread 【发布时间】:2013-12-02 10:00:37 【问题描述】:

主上下文在主队列中工作,单独的操作在单独的线程中工作,上下文由私有队列初始化。一切正常,但发生了一个小问题。

我发现有时当我从后台线程中删除记录时,我在访问 FRC 中的故障对象时遇到异常。似乎当 FRC 处理它获得的条目并且后台线程删除相同的对象时,会发生这种情况。

我应该怎么做才能防止异常发生?我看到的一种解决方案是在托管对象上使用特殊属性来指示它已被(对象)删除。或者我应该以某种方式告诉后台任务在 FRC 完成工作之前不要删除条目。

已编辑:我的代码订阅了 NSManagedObjectContextDidSaveNotification。目标 SDK:iOS 7

主上下文:

- (NSManagedObjectContext *)mainManagedObjectContext

if (_mainManagedObjectContext != nil) 
    return _mainManagedObjectContext;


_mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_mainManagedObjectContext.persistentStoreCoordinator = [self persistentStoreCoordinator];
return _mainManagedObjectContext;

背景背景:

- (NSManagedObjectContext*)newPrivateContext

    NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    context.persistentStoreCoordinator = self.persistentStoreCoordinator;
    return context;

【问题讨论】:

你能展示你是如何构建主上下文和工作上下文的 - 即父子或观察 NSManagedObjectContextDidSaveNotification。您是否希望这可以在 iOS5 上运行? 【参考方案1】:

或者我应该以某种方式告诉后台任务在 FRC 完成工作之前不要删除条目。

那是stinky 代码。后台线程不需要知道控制器在做什么。

一个更现代的模式是

- (NSManagedObjectContext*)newPrivateContext

    NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    context.parent = self.mainManagedObjectContext;
    return context;

然后……

NSManagedObjectContext *workerContext = [self newPrivateContext];

[workerContext performBlock:^

    //stuff to be done on the background thread

    NSError *error = NULL;
    if ([context save:&error]) 
        //handle error
    

];

这项工作将在后台线程上完成,您可以删除对NSManagedObjectContextDidSaveNotification 的观察,因为在两个上下文之间建立父子关系会自动处理。

不确定这是否是您的全部问题,但如果您没有完全正确地使用NSManagedObjectContextDidSaveNotification,可能会导致奇怪的情况。

【讨论】:

以上是关于winform中的多线程问题的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET WebForm中有多线程的概念吗?

Winform c# 多线程处理实例 地址 可以下载!

Winform c# 多线程处理实例 地址 可以下载!

Python中的多线程并行运行

MySQL中的多线程?

actionscript 中的多线程还是绿色线程?