标签: ui-thread

数据绑定总是编组到UI线程吗?

绑定到Silverlight 3和4中的属性时,Windows Phone 7版本的Silverlight和WPF 3.5和4中的属性更改通知是否总是被编组到UI线程?您是否知道我不能依赖它的任何场景,并且必须在我的代码中进行编组操作?

data-binding silverlight wpf multithreading ui-thread

3
推荐指数
1
解决办法
935
查看次数

WPF/C# 不要阻塞 UI

我有一个现有的 WPF 应用程序,它有几个部分。每个部分都是一个 UserControl,它实现了一个接口。

该接口指定了两种方法:void LoadData([...])bool UnloadData()

这些方法是由UI线程调用的,所以如果很耗时,我们需要在backgroundworker中完成我们的工作。

没有问题,LoadData因为我们可以异步更新 UI。问题在于 UnloadData()。

如果我们真的可以离开当前视图,这应该返回。

这是根据数据的当前状态(已保存/修改/无效)计算的:

  • 保存返回真,
  • Invalid 询问您是要留下来保存一些正确的数据还是不保存就离开
  • 修改后告诉你,你可以取消你的更改(返回真),或者继续编辑(返回假),或者保存你当前的数据(返回真​​)

问题在于“修改 - > 保存”。这是一种耗时的方法,因此为了尊重应用程序的理念,我们应该在后台线程中运行它(带有忙碌指示器)。

但是如果我们只是启动线程并进入下一节,它会向方法调用返回“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),通过反射加载。

这不是我的选择,我觉得它不好,但我现在必须处理它。我主要是在寻找让我的方法等待我的方法返回的方法。我不确定这是否可能。但我正在寻找一种解决方法,它将为我节省数周的工作时间。

.net c# wpf backgroundworker ui-thread

3
推荐指数
1
解决办法
6474
查看次数

使用TPL时避免窗口(WPF)冻结

我正在构建一个WPF,它有一个在sql server中执行sql查询的按钮(查询可能需要很长时间才能运行).我想使用TPL来做到这一点.

此代码:var result = Task.Factory.StartNew(()=> {command.ExecuteNonQuery();});

给出了这个异常:ExecuteNonQuery需要一个开放且可用的连接.连接的当前状态已关闭.

我想这是因为查询在不同的线程上运行而且不知道打开的连接.

我有两个问题:1.如何让新线程知道这个开放连接?2.解决此问题后,如何通过此查询使窗口不冻结.

谢谢

wpf window freeze ui-thread task-parallel-library

2
推荐指数
1
解决办法
2562
查看次数

为什么不能通过UI线程的线程访问视图?

我知道没有线程可以访问当前视图,除非它是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)

每次我想改变布局时,这样做都很痛苦.有不同的工作吗?我知道异步任务,我从来没有找到一个好的方法来使用它,它比我正在做的更好吗?所有相关的答案都很贴心!

java android ui-thread

2
推荐指数
1
解决办法
2686
查看次数

内联javascript是否会阻止UI线程?

我读了这篇关于外部脚本如何阻止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线程?

javascript nonblocking src blocking ui-thread

2
推荐指数
1
解决办法
2694
查看次数

如何停止执行UI线程,直到异步任务完成,以返回在android中的AsyncTask中获取的值

我有一个类,我已经编写了一个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)

android return-value execution ui-thread android-asynctask

2
推荐指数
1
解决办法
4192
查看次数

使用单独的线程时,我得到`android.os.NetworkOnMainThreadException`

在我的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)

android ui-thread android-handler

2
推荐指数
1
解决办法
3649
查看次数

持有两次Windows Phone 8.1的事件

我有一个举办活动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)

c# ui-thread messagedialog eventhandler

2
推荐指数
1
解决办法
876
查看次数

发布到UI线程

我想创建一个新的线程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 postafter post,但从来没有inside post.

我究竟做错了什么?

multithreading android ui-thread kotlin android-handler

2
推荐指数
1
解决办法
1685
查看次数

RecyclerView 在更新期间阻塞 ui 线程

我的清单中有 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

2
推荐指数
1
解决办法
8413
查看次数