绑定到Silverlight 3和4中的属性时,Windows Phone 7版本的Silverlight和WPF 3.5和4中的属性更改通知是否总是被编组到UI线程?您是否知道我不能依赖它的任何场景,并且必须在我的代码中进行编组操作?
我有一个现有的 WPF 应用程序,它有几个部分。每个部分都是一个 UserControl,它实现了一个接口。
该接口指定了两种方法:void LoadData([...])和bool UnloadData()。
这些方法是由UI线程调用的,所以如果很耗时,我们需要在backgroundworker中完成我们的工作。
没有问题,LoadData因为我们可以异步更新 UI。问题在于 UnloadData()。
如果我们真的可以离开当前视图,这应该返回。
这是根据数据的当前状态(已保存/修改/无效)计算的:
问题在于“修改 - > 保存”。这是一种耗时的方法,因此为了尊重应用程序的理念,我们应该在后台线程中运行它(带有忙碌指示器)。
但是如果我们只是启动线程并进入下一节,它会向方法调用返回“true”,我们将直接启动下一个视图。
就我而言,在保存本地数据之前加载下一个视图可能是个问题。
所以:
有没有办法在返回“true”之前等待后台线程完成,而不阻塞 UI?
public bool UnloadData(){
if(...){
LaunchMyTimeConsumingMethodWithBackgroundWorker();
return true;//Only when my time consuming method ends
}
//[...]
}
Run Code Online (Sandbox Code Playgroud)
重要编辑 也许我不够清楚:我知道如何使用 BackgroundWorker 或 TPL。我的问题是父类(调用 UnloadData() 的那个类是一个我无法编辑的类(出于多种原因:它在另一个不会重新加载的 DLL 中,它已经与 70 多个用户控件一起使用,全部分开项目(dll),通过反射加载。
这不是我的选择,我觉得它不好,但我现在必须处理它。我主要是在寻找让我的方法等待我的方法返回的方法。我不确定这是否可能。但我正在寻找一种解决方法,它将为我节省数周的工作时间。
我正在构建一个WPF,它有一个在sql server中执行sql查询的按钮(查询可能需要很长时间才能运行).我想使用TPL来做到这一点.
此代码:var result = Task.Factory.StartNew(()=> {command.ExecuteNonQuery();});
给出了这个异常:ExecuteNonQuery需要一个开放且可用的连接.连接的当前状态已关闭.
我想这是因为查询在不同的线程上运行而且不知道打开的连接.
我有两个问题:1.如何让新线程知道这个开放连接?2.解决此问题后,如何通过此查询使窗口不冻结.
谢谢
我知道没有线程可以访问当前视图,除非它是UI线程.我想知道为什么?为什么哪个线程正在改变视图?这是安全原因吗?这是我使用的工作:
public void doLayout()
{
Runnable run = new Runnable()
{
public void run()
{
ViewerActivity.setContentView(R.layout.main);
}
};
handler.post(run);
}
private Handler handler;'
Run Code Online (Sandbox Code Playgroud)
每次我想改变布局时,这样做都很痛苦.有不同的工作吗?我知道异步任务,我从来没有找到一个好的方法来使用它,它比我正在做的更好吗?所有相关的答案都很贴心!
我读了这篇关于外部脚本如何阻止UI线程的好文章,但我不清楚阻塞是否实际上是由于<script>标记或src='/myscript.js'src属性的存在.
我的问题是内联javascript(缺少src属性声明),例如:
<script type='text/javascript'> alert('am i blocking too?');</script>
Run Code Online (Sandbox Code Playgroud)
或这个:
<script type='text/javascript'> var php='<?=json_encode($myObj)?>';</script>
Run Code Online (Sandbox Code Playgroud)
还阻止UI线程?
我有一个类,我已经编写了一个AsyncTask来从网上获取Json.
public class MyAsyncGetJsonFromUrl extends AsyncTask<Void, Void, JSONObject> {
Context context_;
String url_;
List<NameValuePair> params_;
public MyAsyncGetJsonFromUrl(Context context_, List<NameValuePair> params_, String url_) {
this.context_ = context;
this.params_ = params_;
this.url_ = url_;
}
@Override
protected JSONObject doInBackground(Void... params) {
JSONObject jObj_ = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url_);
httpPost.setEntity(new UrlEncodedFormEntity(params_));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
InputStream is_ = httpEntity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = …Run Code Online (Sandbox Code Playgroud) 在我的Activity中我使用了一个处理程序
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//do GUI stuff, edit views, etc..
}
};
Run Code Online (Sandbox Code Playgroud)
我也有一个Runnable,发布到PHP并等待json响应
Runnable runnable3 = new Runnable() {
public void run() {
JSONParserArray jsonParserRun = new JSONParserArray();
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("p1", "myParam1"));
try {
String link = "http://mylink.com/someFileOnServer.php";
JSONArray jArray = jsonParserRun.makeHttpRequest(link , "POST",
params);
if (jArray != null && jArray.length() != 0) {
} else {
//either null (because of throwing exception) or empty …Run Code Online (Sandbox Code Playgroud) 我有一个举办活动ListBoxItem.因此,当我持有一个项目时,它会在函数中向右输入,但它会在它被触发两次时出现.
private async void OutersAndContactInTel_Holding(object sender, HoldingRoutedEventArgs e)
{
try
{
FrameworkElement element = (FrameworkElement)e.OriginalSource;
if (element.DataContext != null && element.DataContext is Contact)
{
Contact selectedContact = (ImOutContact)element.DataContext;
if (selectedContact.IsOuter)
{
MessageDialog msgToAddContact = new MessageDialog("Voulez-vous vraiment suivre " + selectedContact.Pseudo + " ?");
msgToAddContact.Commands.Add(new UICommand("Oui", (UICommandInvokedHandler) =>
{
AddContactProcess(selectedContact);
}));
msgToAddContact.Commands.Add(new UICommand("Non"));
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => msgToAddContact.ShowAsync());
}
else
{
MessageDialog msgToInviteContact = new MessageDialog("Envoyez une invitation à l'utilisation de l'application par sms à " + selectedContact.NomPrenom + …Run Code Online (Sandbox Code Playgroud) 我想创建一个新的线程onCreate并使用posta 来与UI线程进行通信View.但是,post似乎永远不会运行ed语句.这里有一个小例子:
import android.app.Activity
import android.os.Bundle
import android.widget.TextView
import kotlin.concurrent.*
import org.jetbrains.anko.*
class MainActivity: Activity(), AnkoLogger {
protected override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val view = TextView(this)
setContentView(view)
thread() {
info("before post")
view.post({ info("inside post") })
info("after post")
}
}
}
Run Code Online (Sandbox Code Playgroud)
查看日志,我只能看到before post和after post,但从来没有inside post.
我究竟做错了什么?
我的清单中有 200 多个项目。RecyclerView 定期更新(每 10 秒)。RecyclerView 在更新期间阻塞 ui 线程几秒钟。我正在使用 notifyDataSetChanged刷新 recyclerview 的方法。有没有其他方法可以防止冻结?顺便说一句,我不想使用分页。
此方法每 10 秒运行一次:
public void refreshAssetList(List<Asset> newAssetList){
recyclerViewAdapter.setAssetList(newAssetList);
recyclerViewAdapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
RecyclerViewAdapter 类:
public class AssetListRecyclerViewAdapter extends RecyclerView.Adapter<AssetListRecyclerViewAdapter.BaseViewHolder> {
private List<Asset> assetList;
Context context;
public AssetListRecyclerViewAdapter(List<Asset> assetList, Context context) {
this.assetList = assetList;
this.context = context;
}
public void setAssetList(List<Asset> assetList) {
this.assetList = assetList;
}
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_asset, null);
return new DetailViewHolder(itemLayoutView);
}
@Override
public void onBindViewHolder(BaseViewHolder holder, …Run Code Online (Sandbox Code Playgroud) android ui-thread android-runonuithread android-recyclerview
ui-thread ×10
android ×5
wpf ×3
c# ×2
.net ×1
blocking ×1
data-binding ×1
eventhandler ×1
execution ×1
freeze ×1
java ×1
javascript ×1
kotlin ×1
nonblocking ×1
return-value ×1
silverlight ×1
src ×1
window ×1